Leetcode笔记目录
一、题目描述
给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 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。
二、解题过程
1.思想
很标准的搜索题,能用dfs就不用bfs,使用递归实现dfs比栈要更简单:
- 用二维数组的值判断是否访问过,即访问后设置其值为1;
2.代码
栈实现:
int direct[5]={-1,0,1,0,-1};
int maxAreaOfIsland(vector<vector<int>>& grid) {
if(grid.empty()) return 0; //错误1
int num=0,maxnum=0,x,y;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[i].size();j++){
if(grid[i][j]==1){
grid[i][j]=0;
num=1;
stack<pair<int,int>> st;
st.push({i,j}); //错误3
while(!st.empty()){
auto [r, c] = st.top();
st.pop();
for(int k=0;k<4;k++){ //错误2
x = r + direct[k]; y = c + direct[k+1];
if(x>=0&&x<grid.size()&&y>=0&&y<grid[i].size()&&grid[x][y]==1){
st.push({x,y});
num++;
grid[x][y]=0;
}
}
}
maxnum = max(num,maxnum);
}
}
}
return maxnum;
}
- 错误
- 进行边界判断;
- 如何更好的遍历四个方向;
- 如何接收pair常量;
- 注意栈实现的结构。
递归实现:
int dfs(vector<vector<int>>& grid,int x,int y){
if(x<0||x>=grid.size()||y<0||y>=grid[0].size()||grid[x][y]==0)return 0;
grid[x][y]=0;
return 1+dfs(grid,x,y+1)+dfs(grid,x,y-1)+dfs(grid,x+1,y)+dfs(grid,x-1,y);
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxnum=0;
for(int i=0;i<grid.size();i++)
for(int j=0;j<grid[0].size();j++){
maxnum=max(maxnum,dfs(grid,i,j));
}
return maxnum;
}
三、总结
简单的搜索题