难度不高,深度优先,广度优先都可以做这道题
这道题我采用深度优先遍历进行处理
具体题解都写在注释里了
class Solution {
// 定义一个方向数组,用于表示一个单元格周围8个方向与当前位置的坐标差
static int[][] dir={{1,1},{1,-1},{-1,-1},{-1,1},{1,0},{-1,0},{0,1},{0,-1}};
public int[] pondSizes(int[][] land) {
// 创建一个ArrayList,用于存储所有湖泊的大小
ArrayList<Integer> ar=new ArrayList<>();
for(int i=0;i<land.length;i++){
for(int j=0;j<land[0].length;j++){
// 如果当前单元格未被访问,并且是湖泊
if(land[i][j]==0){
int space=1; // 初始化当前湖泊的面积为1
ar.add(dfs(land,i,j,space)); // 对当前湖泊进行DFS,并将其面积添加到ArrayList中
}
}
}
// 将ArrayList转换为int数组,然后对所有湖泊的大小进行排序
int[] pool=new int[ar.size()];
for(int k=0;k<pool.length;k++){
pool[k]=ar.get(k);
}
Arrays.sort(pool);
return pool;
}
// 定义DFS函数, 用于搜索与当前单元格相邻的所有湖泊单元格的面积
public int dfs(int[][] land,int dx,int dy,int space){
// 根据边界条件和未访问的单元格判断是否遍历完成当前湖泊
if(dx<0||dy<0||dx>=land.length||dy>=land[0].length||land[dx][dy]!=0){
return space; // 当前湖泊已遍历完成,返回湖泊的面积
}
land[dx][dy]=-1; // 标记当前单元格已被访问
for(int i=0;i<8;i++){
int x=dx+dir[i][0],y=dy+dir[i][1];
while(x>=0&&x<land.length&&y>=0&&y<land[0].length&&land[x][y]==0){
space++; // 如果当前单元格是湖泊的一部分,则增加当前湖泊的面积
space=dfs(land,x,y,space); // 继续向湖泊周围的单元格搜索
land[x][y]=-1; // 标记当前湖泊中的单元格已被访问
x+=dir[i][0]; // 在当前方向上继续向前移动一格
y+=dir[i][1];
}
}
return space;
}
}
当然,我们可以不使用static dir方向数组,直接使用for循环替换,进行深度优先搜索
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) {
continue;
}
res += dfs(land, x + dx, y + dy);
}
}