_莫相逢

导航

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 };

 

posted on 2019-04-09 15:55  莫晓风  阅读(108)  评论(0编辑  收藏  举报