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