题目的链接在这里:https://leetcode-cn.com/problems/max-area-of-island/
题目大意
给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
一、示意图
二、解题思路
栈实现
代码如下:
class Solution {
int[] direction={-1,0,1,0,-1};
//这里的五个数组 每两个相邻的就是一个对应的上下左右四个方向
public int maxAreaOfIsland(int[][] grid) {
//也就是统计相邻的1的个数最大值 就是标准的搜索题
//这里使用深度遍历的方法 存在一个主函数和一个辅函数
//主函数用于遍历所有的搜索位置,判断是否可以开始搜索,如果可以就在辅函数这边进行搜索,而辅函数就是负责深度优先搜索的递归调用
//先试试看用栈来写
int m=grid.length;
int n=grid[0].length;
int localArea=0;
int area=0;
int x,y;
//开始进行遍历
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(grid[i][j]==1){
//如果这个地方是对应的岛屿 也就是1的话
localArea=1;
//并把这个地方标记成0 为了防止又遍历回来
grid[i][j]=0;
//然后就是创建一个栈,这个栈里存入一个数组吧
Stack<int[][]> result=new Stack<>();
//然后把那个标记的位置存入 这个二维数组
int[][] T=new int[][]{{i}, {j}};
System.out.println("T = " + T[0][0]+" "+T[1][0]);
result.push(new int[][]{{i}, {j}});
//再判断这个二维数组空不空
while(!result.isEmpty()){
//不空的话,取出栈顶元素
int[][]temp=result.peek();
// System.out.println("temp = " + temp);
//再删去栈顶元素
result.pop();
//再对栈顶元素进行 四个方向的判断 这个不确定
int left=temp[0][0];
System.out.println("left = " + left);
int right=temp[1][0];
System.out.println("right = " + right);
for(int k=0;k<4;k++){
x=left+direction[k];
y=right+direction[k+1];
//再进行非越界和为1的判断
if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1){
//没有越界并且面积为1
localArea++;
grid[x][y]=0;
//并将其放入到栈中
result.push(new int[][]{{x}, {y}});
}
}
}
//这里每一次local都要重新赋值一下 而area存储每一次的最大值 确保每一个都便利过一遍
area=Math.max(area,localArea);
}
}
}
return area;
}
}