zoukankan      html  css  js  c++  java
  • LeetCode 695 岛屿的最大面积

    题目:

    给定一个包含了一些 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’。

    示例 2:

    [[0,0,0,0,0,0,0,0]]

    对于上面这个给定的矩阵, 返回 0

    注意: 给定的矩阵grid 的长度和宽度都不超过 50。

    解题思路:

    深度优先搜索。以grid为1的坐标为中心,分别向上下左右四个方向进行搜索,这里注意边界条件:四个方向的坐标应该在grid矩阵内。

    代码:

     1 class Solution {
     2 public:
     3     int cnt;
     4     int c,k;
     5     int maxArea = 0;
     6     int maxAreaOfIsland(vector<vector<int>>& grid) {
     7         vector<vector<bool>> visited;
     8         
     9         c = grid.size();
    10         k = grid[0].size();
    11         visited.resize(c);
    12         for(int i=0; i<c; i++)    //visited数组初始化,对于本题可以直接用grid作为访问标记。
    13             visited[i].resize(k);
    14         for(int i=0; i<c; ++i)
    15             for(int j=0; j<k; ++j){
    16                 visited[i][j] = false;
    17             }
    18         
    19         for(int i=0; i<c; ++i)
    20             for(int j=0; j<k; ++j) {
    21                 if(!visited[i][j] && grid[i][j]) {
    22                     cnt = 1;
    23                     DFS(grid,i,j,visited);
    24                     maxArea = max(maxArea, cnt); 
    25                 }
    26             }
    27         return maxArea;
    28     }
    29     
    30     void DFS(vector<vector<int>> &grid, int i,int j, vector<vector<bool>> &visited) {
    31         visited[i][j] = true;
    32         //以下进行上下左右搜索
    33         if(i+1 < c && !visited[i+1][j] && grid[i+1][j] ) {
    34             cnt++;
    35             DFS(grid,i+1,j,visited);
    36             
    37         }
    38         if(i-1>=0 && !visited[i-1][j] && grid[i-1][j]) {
    39             cnt++;
    40             DFS(grid, i-1, j, visited);
    41             
    42         }
    43         if(j+1<k && !visited[i][j+1] && grid[i][j+1]) {
    44             cnt++;
    45             DFS(grid,i,j+1,visited);
    46            
    47         }
    48         if(j-1>=0 && !visited[i][j-1] && grid[i][j-1]) {
    49             cnt++;
    50             DFS(grid,i,j-1,visited);
    51             
    52         }
    53     }
    54 };
  • 相关阅读:
    数据处理——时间数据处理
    数据处理——异常值检测
    数据处理——缺失值处理
    数据分析——数据校验
    Python之Pandas知识点
    Python基础知识之疑点难点
    Python习题(第3课)
    跳一跳小外挂(附完整代码)
    《软件工程》实训报告
    用户使用手册与测试报告(团队作业)
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10677458.html
Copyright © 2011-2022 走看看