1.题目
2.思路
经典的DFS+回溯法套路模板,这题比较麻烦的是需要遍历 8 个方向
Java语言题解
class Solution {
List<Integer> array = new ArrayList<Integer>();
int rowLen;
int colLen;
public int[] pondSizes(int[][] land) {
rowLen = land.length;
colLen = land[0].length;
for(int i = 0;i<rowLen;i++){
for(int j = 0;j<colLen;j++){
if(land[i][j] == 0){
array.add(dfs(land,i,j));
land[i][j] = 0;
}
}
}
Collections.sort(array);
int size = array.size();
int[] result = new int[size];
for(int i = 0;i<size;i++){
result[i] = array.get(i).intValue();
}
return result;
}
public int dfs(int[][] land,int i,int j){
if(!checkBoard(land,i,j)){
return 0;
}
int count = 1;
land[i][j] = -1;
count+=dfs(land,i-1,j-1); // 左上角
count+=dfs(land,i-1,j); //正上方
count+=dfs(land,i-1,j+1); //右上角
count+=dfs(land,i,j+1); //右一个
count+=dfs(land,i+1,j+1); //右下角
count+=dfs(land,i+1,j); //正下方
count+=dfs(land,i+1,j-1);//左下角
count+=dfs(land,i,j-1); //左一个
return count;
}
public boolean checkBoard(int[][] land,int i,int j){
if(i>=rowLen || i<0) return false;
if(j>=colLen || j<0) return false;
return land[i][j] == 0;
}
}
3.总结
不要忘记回溯,DFS过程中做的标记需要记得还原,否则会栈溢出