Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >矩阵中岛数量问题

矩阵中岛数量问题

作者头像
名字是乱打的
发布于 2022-05-13 01:46:57
发布于 2022-05-13 01:46:57
68200
代码可运行
举报
文章被收录于专栏:软件工程软件工程
运行总次数:0
代码可运行

一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个 矩阵中有多少个岛? 举例: 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 这个矩阵中有三个岛。 不分布式的思路: 遍历矩阵,碰到为1的则岛数+1,并且递归的更改该点和其上下左右数值为1的点的值为2 分布式的思路: 将非常非常大的矩阵均匀的分给各个机器进行处理 各个机器收集自己机器上岛的数量和边界信息;统计总岛的数量,利用并查集合并边界,如果两个边界的根是可合并的,减一个岛的数量

不分布式代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.algorithm.practice.matrix;

public class IsLand {

    public static int countIslands(int[][] m) {
        if (m == null || m[0] == null) {
            return 0;
        }
        int N = m.length;//行数
        int M = m[0].length;//列数
        int res = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (m[i][j] == 1) { //遍历找出每个是1的位置
                    res++;
                    infect(m, i, j, N, M);
                }
            }
        }
        return res;
    }

    public static void infect(int[][] m, int i, int j, int N, int M) { //将m矩阵(i,j)位置周边的1都改为2
        if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != 1) {
            return;//如果(i,j)不在矩阵中,退出
        }
        m[i][j] = 2;
        //将该点的上下左右为1的数继续改为2并递归
        infect(m, i + 1, j, N, M);
        infect(m, i - 1, j, N, M);
        infect(m, i, j + 1, N, M);
        infect(m, i, j - 1, N, M);
    }

    public static void main(String[] args) {
        int[][] m1 = {
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                { 0, 1, 1, 1, 0, 1, 1, 1, 0 },
                { 0, 1, 1, 1, 0, 0, 0, 1, 0 },
                { 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 1, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, };
        System.out.println(countIslands(m1));

        int[][] m2 = {
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                { 0, 1, 1, 1, 1, 1, 1, 1, 0 },
                { 0, 1, 1, 1, 0, 0, 0, 1, 0 },
                { 0, 1, 1, 0, 0, 0, 1, 1, 0 },
                { 0, 0, 0, 0, 0, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 1, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, };
        System.out.println(countIslands(m2));

    }

}

分布式岛的图解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-02-04:第一年农场有1只成熟的母牛A,往后的每年
2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟 ③每一只母牛永远不会死 。请问N年后牛的数量是多少 ?
福大大架构师每日一题
2021/02/04
3430
2021-02-04:第一年农场有1只成熟的母牛A,往后的每年
深度解析算法之BFS解决FloodFill算法
题目链接 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sc 和 color 。你应该从像素 image[sr][sc] 开始对图像进行上色 填充 。
Undoom
2025/07/20
690
深度解析算法之BFS解决FloodFill算法
DFS 算法秒杀五道岛屿问题
岛屿问题是经典的面试高频题,虽然基本的岛屿问题并不难,但是岛屿问题有一些有意思的扩展,比如求子岛屿数量,求形状不同的岛屿数量等等,本文就来把这些问题一网打尽。
labuladong
2021/10/27
9640
2021-07-28:最短的桥。在给定的二维二进制数组 A 中,存
2021-07-28:最短的桥。在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1 。)
福大大架构师每日一题
2021/07/28
4190
2021-07-28:最短的桥。在给定的二维二进制数组 A 中,存
433. 岛屿的个数遍历加递归
给一个01矩阵,求不同的岛屿的个数。 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
和蔼的zhxing
2018/09/04
5710
​LeetCode刷题实战576:出界的路径数
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/04/12
2380
​LeetCode刷题实战576:出界的路径数
Leetcode 200 Number of Islands 并查集
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by wate
triplebee
2018/01/12
1.2K0
剑指 Offer 13. 机器人的运动范围
一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。
Vincent-yuan
2021/07/29
4950
前端算法题目解析(二)
虽然疫情还是严峻,但总会过去。在此居家办公之际,应该趁这个时机好好提升下自我,多读书多看报,少吃零食多运动哈哈。
小皮咖
2020/02/24
8290
[LintCode] Number of Islands(岛屿个数)
0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
HoneyMoose
2019/01/30
4740
LeetCode笔记:695. Max Area of Island
我们遍历二维数组的时候,遇到1了,肯定是要检查上下左右是否依然是1(同时注意不要超出边界),如果检查出某一边是1,则还要进一步继续检查它的上下左右是否是1,这说明我们要通过递归来做,遍历时每遇到一个1,就放到递归中去检测并计算岛屿面积。
Cloudox
2021/11/23
3270
深度搜索问题-LeetCode 200、130(DFS,Coredumped问题)
这个是某公司的面试题,但对于笔者来说,这是linux C++必须掌握的技能!不然真的小白了! 假设下面的程序,很明显,这是一个错误的程序,不可以将一个字符串直接拷贝到空指针中!
算法工程师之路
2019/11/14
6740
LeetCode200.岛屿的个数
 dfs做法,遇到1,就进入infect函数,将1及其周围是1的全部”感染“成2
mathor
2018/08/17
4760
LeetCode200.岛屿的个数
【蓝桥杯省赛】冲刺练习题【数学公式】倒计时【06】
根据算术基本定理又称唯一分解定理,对于任何一个合数, 我们都可以用几个质数的幂的乘积来表示。
红目香薰
2022/11/29
5310
【蓝桥杯省赛】冲刺练习题【数学公式】倒计时【06】
2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board
2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。力扣130。
福大大架构师每日一题
2021/10/14
4620
Acwing枚举、模拟与排序(二)
cin和scanf都不会干掉第一行的回车。 在这些函数执行完成之后,执行getline之前,多执行一次getline:去掉回车。
WuShF
2024/03/08
1420
从暴力递归到动态规划
 动态规划没有那么难,但是很多老师在讲课的过程中讲的并不好,由此写下一篇文章记录学习过程
mathor
2018/09/19
7210
从暴力递归到动态规划
2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少
2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。
福大大架构师每日一题
2023/05/07
4320
2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少
web前端开发面试中常见的算法题(JS)
最近在准备秋招,做过了大大小小的公司的面试题,发现除了基础知识外,算法还是挺重要的。特意整理了一些常见的算法题,添加了自己的理解并实现。
全栈程序员站长
2022/09/07
6900
杂七杂八的练习(3)
假设你有一个长的花坛,其中一些地块种植着花,另一些没有。 然而,花不能种植在相邻的地块否则他们会争取水导致两者都死亡。 给定一个花坛(表示为包含0和1的数组,其中0表示没有种花,1表示种植着花)以及数字n。如果n个新鲜花可以种植在其中则返回真,否则返回假。
ttony0
2022/12/26
4040
推荐阅读
相关推荐
2021-02-04:第一年农场有1只成熟的母牛A,往后的每年
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档