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;
}
};方法三:若把方法二中的堆栈改为队列,就变成了广度优先搜索。

京公网安备 11010502036488号