题目
给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
思路1
利用广搜,每次搜到的,就将面积加一,最终等待当前搜索队列为空,也就表明某一个岛屿被完全搜索了!这个时候,再与结果进行比较,两者相较取较大值即可!
代码
import java.util.LinkedList;
import java.util.Queue;
// 等待搜索的元素
class Element
{
int x;
int y;
public Element(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Solution {
int ans=0;
// 全局地图
int map[][]=new int[50][50];
// 全局标记数组
int visited[][]=new int[50][50];
// 方向数组
int direction[][]={{0,1},{1,0},{0,-1},{-1,0}};
// 地图的行
int row=0;
// 地图的列
int column=0;
// 搜索队列
Queue<Element> queue =new LinkedList<>();
public int maxAreaOfIsland(int[][] grid) {
row=grid.length;
column= grid[0].length;
for (int i=0;i<row;++i)
{
for (int j=0;j<column;++j)
{
map[i][j]=grid[i][j];
visited[i][j]=0;
}
}
for (int i=0;i<row;++i)
{
for (int j=0;j<column;++j)
{
// 当找到一个没有被访问过的节点并且全局数组标记为1,即是发现了一个从来没有被搜索过的岛屿,那么就进行一次广搜
if (map[i][j]==1 && visited[i][j]==0)
{
queue.add(new Element(i,j));
visited[i][j]=1;
bfs();
}
}
}
return ans;
}
// 广搜
private void bfs()
{
int count=0; // 当前岛屿的面积
while (!queue.isEmpty())
{
Element temp= queue.poll();
++count;
int t_x=0;
int t_y=0;
for (int i=0;i<4;++i) // 往上下左右四个方向进行搜索
{
t_x=temp.x+direction[i][0];
t_y= temp.y+direction[i][1];
if (check(t_x,t_y)) // 符合条件的就直接加入搜索队列并且将其标记为已访问
{
queue.add(new Element(t_x,t_y));
visited[t_x][t_y]=1;
}
}
}
ans=ans>count?ans:count;
}
private boolean check(int x, int y)
{
// 横坐标不越界 纵坐标不越界
return x>=0 && x<row && y>=0 && y<column && map[x][y]==1 && visited[x][y]==0;
}
}
结果
速度不算很快,目前没有什么好思路!先暂时这样子写!