LeetCode:200岛屿数量

方法一:

java 复制代码
class Solution {
    public int numIslands(char[][] grid) {
        //空网格判断
        if(grid == null || grid.length == 0){
            return 0;
        }

        int count = 0;
        int row = grid.length;
        int cols = grid[0].length;
        //循环遍历每一个网格
        for(int r = 0; r < row; r++){
            for(int c = 0; c < cols; c++){
                if(grid[r][c] == '1'){
                    count++;
                    //将该网格以及上下左右的网格置为0
                    sinkIsland(grid, r, c);
                }
            }
        }
        return count;
    }
    //处理'1'以及周边置为'0'
    private void sinkIsland(char[][] grid, int r, int c){
        if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || grid[r][c] == '0'){
            return;
        }

        grid[r][c] = '0';

        sinkIsland(grid, r - 1, c);
        sinkIsland(grid, r, c - 1);
        sinkIsland(grid, r + 1,c);
        sinkIsland(grid, r, c +1);
    }
}

这里注意图里面给的都是字符,所以在比较的时候应该使用'0'而不是直接0;另外"="是赋值运算符,"=="是比较运算符,返回的是true和false。

方法二:

java 复制代码
class Solution {
    public int numIslands(char[][] grid) {
        //空网格判断
        if(grid == null || grid.length == 0){
            return 0;
        }

        int count = 0;
        int row = grid.length;
        int cols = grid[0].length;

        boolean[][] visited = new boolean[row][cols];

        //循环遍历每一个网格
        for(int r = 0; r < row; r++){
            for(int c = 0; c < cols; c++){
                if(grid[r][c] == '1' && !visited[r][c]){
                    count++;
                    
                    dfs(grid, r, c,visited);
                }
            }
        }
        return count;
    }
    //在新建的二维数组visited上进行操作
    private void dfs(char[][] grid, int r, int c, boolean[][] visited){
        if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || grid[r][c] == '0' || visited[r][c]){
            return;
        }

        visited[r][c] = true;

        dfs(grid, r - 1, c, visited);
        dfs(grid, r, c - 1, visited);
        dfs(grid, r + 1, c, visited);
        dfs(grid, r, c +1, visited);
    }
}

方法一的思路是在原数组上做修改,但是实际业务中可能不允许这样做,所以引出了第二种方法,新建了一个二维数组,与方法一直接在原来数组上进行置0操作不同的地方在于,方法二在新建的boolean数组中进行将默认的false置为true的操作。

方法二思路:

循环遍历元素,只有满足该格为1且boolean数组为true才count++,然后在boolean数组中将身边的元素置为true,这样下次遍历的这里的时候就不会执行count++操作了;需要注意的是在双层循环的遍历条件中!visitedrc这个条件的使用,因为初始化数组是false;另外后续将boolean数组中的元素置为ture从而可以实现在后续的循环中当作fasle进行跳过的步骤。

相关推荐
程序员yu14 分钟前
会编网络:别被入门教程骗了,Python实用能力不在语法本身
开发语言·python·学习·算法
解决小子41 分钟前
2026年中国就业情况报告
ai·职场和发展·创业创新·业界资讯·就业
Allen_LVyingbo1 小时前
信息化部门在AI时代的编程转移路径分析(上)
人工智能·python·算法·健康医疗·数据库开发·时序数据库·数据库架构
七牛云行业应用1 小时前
Jev 报 401 / api_key_required 怎么解决:TypeSafe AI 官方错误码表与排查步骤
算法·github
晴天的雨.9921 小时前
【C++算法】三数之和
开发语言·c++·算法
多多爱学习2 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
续写烂尾2 小时前
MK SD NAND(贴片式TF卡)替代Nor Flash:1Gb容量与256Mb Nor
算法·microsoft
u0111026753 小时前
图片预览越来越占内存聊聊 URL.createObjectURL 的释放时机
图像处理·深度学习·算法·ai作画
Zane19943 小时前
同样是遍历图,为什么BFS能保证找到最短路径,DFS却不行
算法
无限码力3 小时前
2026华为OD机试真题 新系统 9月27日【坚果巧克力】
算法·华为od·华为od机考·华为od机试真题·华为od机试·华为od机考真题题解·华为社招笔试真题