zoukankan      html  css  js  c++  java
  • DFS_200. 岛屿数量

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

    岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

    此外,你可以假设该网格的四条边均被水包围。

    示例 1:

    输入:
    [
    ['1','1','1','1','0'],
    ['1','1','0','1','0'],
    ['1','1','0','0','0'],
    ['0','0','0','0','0']
    ]
    输出: 1

    示例 2:

    输入:
    [
    ['1','1','0','0','0'],
    ['1','1','0','0','0'],
    ['0','0','1','0','0'],
    ['0','0','0','1','1']
    ]
    输出: 3
    解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/number-of-islands


    思路:

    这简直就和上一题695的连通问题一模一样嘛

    DFS,695理解透彻了,这个就是简简单单。

    就是一毛一样的题,只是换了个输出,上个最大多少,这个有多少块是连通的,换汤不换药。

    class Solution {
        //有了上个题的经验,这里我上来就直接定义一个方向
        final int[][] DIRS = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        public int numIslands(char[][] grid) {
            //一进来呢还是一样,先判断一下特殊情况
            if (grid == null || grid.length == 0 || grid[0].length == 0) {
                return 0;
            }
            //记录数组的行和列和是否已经判断过
            final int row = grid.length;
            final int col = grid[0].length;
            boolean [][] isVisited = new boolean[row][col];
            int res = 0;
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    if (grid[i][j] == '1' && !isVisited[i][j]){
                        res += dfs(grid,i,j,isVisited);
                    }
                }
            }
            return res;
        }
        
        public int dfs(char [][] gird,int i ,int j,boolean[][] isVisited){
            //进来了就说明这个点访问过了
            isVisited[i][j] = true;
            int count = 1;
            for (int [] DIR : DIRS){
                int newRow = i + DIR[0];
                int newCol = j + DIR[1];
                if (checkBoundary(gird,newRow,newCol) && gird[newRow][newCol] == '1' && !isVisited[newRow][newCol]){
                    dfs(gird,newRow,newCol,isVisited);
                }
            }
            return count;
        }
        
        //判断是否越界的方法
        public boolean checkBoundary(char [][] gird, int i ,int j){
            final int row = gird.length;
            final int col = gird[0].length;
            return i >= 0 && i < row && j >= 0 && j < col;
        }
    }
  • 相关阅读:
    获取数字的位数
    使用json把php数据传给js处理
    Java实现带括号优先级的计算器
    Java使用正则表达式解析LRC歌词文件
    Android开发环境搭建:离线安装ADT插件和安装SDK
    【转】C语言快速幂取模算法小结
    【转】Java高手真经全套书籍分享
    10.19stark组件开发(三)
    10.18正式开发stark组件*(三)
    10.17正式开发stark项目(二)
  • 原文地址:https://www.cnblogs.com/zzxisgod/p/13365579.html
Copyright © 2011-2022 走看看