• 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 };
  • 相关阅读:
    MATLAB读取文件——从非常规文本文件中读取数据
    注意——CAN通信设备控制
    硬件——USB传输速度和物理接口
    STM32F4-浮点DSP库的MDK开发环境的设置
    CRC校验
    蓝牙串口使用心得
    Mysql 层级、执行顺序、执行计划分析
    讲一讲垃圾回收算法
    【转】Java中的新生代、老年代、永久代和各种GC
    工具链接
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10677458.html
Copyright © 2020-2023  润新知