zoukankan      html  css  js  c++  java
  • LeetCode树系列(2)——深度搜索运用:LeetCode695题详解

    一、题目描述

      给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。

      找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)

    示例 1:
    
    [[0,0,1,0,0,0,0,1,0,0,0,0,0],
    [0,0,0,0,0,0,0,1,1,1,0,0,0],
    [0,1,1,0,1,0,0,0,0,0,0,0,0],
    [0,1,0,0,1,1,0,0,1,0,1,0,0],
    [0,1,0,0,1,1,0,0,1,1,1,0,0],
    [0,0,0,0,0,0,0,0,0,0,1,0,0],
    [0,0,0,0,0,0,0,1,1,1,0,0,0],
    [0,0,0,0,0,0,0,1,1,0,0,0,0]]

      对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。

    二、解题思想

      将图看做树的深度遍历,用于计算岛屿的面积,每次遍历一个点,然后对这个点进行深度遍历,遍历到的点就沉没(值变为0),直到遍历完全部的图。

    三、代码实现

    class Solution {
        public int maxAreaOfIsland(int[][] grid) {
            int res = 0; 
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[i].length; j++) {
                    if (grid[i][j] == 1) {
                        res = Math.max(res, dfs(i, j, grid));
                    }
                }
            } 
            return res;
        }
        // 每次调用的时候默认num为1,进入后判断如果不是岛屿,则直接返回0,就可以避免预防错误的情况。
        // 每次找到岛屿,则直接把找到的岛屿改成0,这是传说中的沉岛思想,就是遇到岛屿就把他和周围的全部沉默。
        // ps:如果能用沉岛思想,那么自然可以用朋友圈思想。有兴趣的朋友可以去尝试。
        private int dfs(int i, int j, int[][] grid) {
            if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length || grid[i][j] == 0) { 
                return 0;
            } 
            grid[i][j] = 0;
            int num = 1;
            num += dfs(i + 1, j, grid);
            num += dfs(i - 1, j, grid);
            num += dfs(i, j + 1, grid);
            num += dfs(i, j - 1, grid);
            return num;
            
        }
    }

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/max-area-of-island
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    luogu P1330 封锁阳光大学 x
    luoguP3353 在你窗外闪耀的星星
    luogu小金明qwq x
    [HDOJ5093] Battle ships(最大匹配)
    [HDOJ5092] Seam Carving(DP,记录路径)
    [UVA1449] Dominating Patterns(AC自动机,STL,计数,神坑)
    [POJ3057]Evacuation(二分图匹配,BFS,二分,好题)
    [POJ3041]Asteroids(二分图,最大匹配)
    [POJ2195]Going Home(带权最大匹配,KM,最小费用流)
    [codeVS1917] 深海机器人问题(费用流,拆边)
  • 原文地址:https://www.cnblogs.com/SupremeBoy/p/12507022.html
Copyright © 2011-2022 走看看