1.给定一个包含了一些 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’。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
方法一:深度优先搜索
class Solution { public: int maxAreaOfIsland(vector<vector<int>>& grid) { int res=0; for(int i=0;i<grid.size();i++) { for(int j=0;j<grid[0].size();j++) { res=max(res,dfs(grid,i,j)); } } return res; } int dfs(vector<vector<int>>& grid,int i,int j) { int ans=0; if(i<0||j<0||i>=grid.size()||j>=grid[0].size()||grid[i][j]!=1) return 0;//不符合条件直接返回0 ans=1; grid[i][j]=0;//走过的点都置零不再计算 int a[4]={0,0,-1,1}; int b[4]={1,-1,0,0};//上下左右四点 for(int index=0;index<4;index++) { int next_i=i+a[index]; int next_j=j+b[index]; ans+=dfs(grid,next_i,next_j);//递归,深度搜索上下左右四点,加起来 } return ans; } };
方法二:堆栈实现深度优先搜索
class Solution { public: int maxAreaOfIsland(vector<vector<int>>& grid) { int res=0; for(int i=0;i<grid.size();i++) { for(int j=0;j<grid[0].size();j++) { int cur=0; stack<int> s1,s2;//在循环最内部声明,每次都重置一下 s1.push(i); s2.push(j); while(!s1.empty()) { int cur_i=s1.top(); int cur_j=s2.top(); s1.pop(); s2.pop(); if(cur_i<0||cur_j<0||cur_i>=grid.size()||cur_j>=grid[0].size()||grid[cur_i][cur_j]!=1) continue;//不符合条件就continue cur++; grid[cur_i][cur_j]=0; int a[4]={0,0,1,-1}; int b[4]={1,-1,0,0}; for(int index=0;index<4;index++) { s1.push(cur_i+a[index]); s2.push(cur_j+b[index]);//符合条件就把上下左右都push进去 } } res=max(res,cur); } } return res; } };
方法三:若把方法二中的堆栈改为队列,就变成了广度优先搜索。