题目
给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。).
思考
- 该题主要是考察深度优先遍历+回溯算法.
- 岛屿不是连接的,可以计算完当前岛屿后与之前计算岛屿面积比较,随时替换岛屿最大面积
- 岛屿面积向四面八方拓展,考虑完极端情况后可以执行向该点四周拓展查找记录岛屿面积,并消灭该岛屿
- 重复遍历无法避免,提前将统计好的岛屿置为0来避免重复计数
解答
package interview;
/**
* AmberGroup一面算法题: 力扣695题
* 递归查找回溯+深度优先遍历
*/
public class AmberGroup01 {
public static void main(String[] args) {
int[][] weak = new int[8][13];
weak[0] = new int[]{0,0,1,0,0,0,0,1,0,0,0,0,0};
weak[1] = new int[]{0,0,0,0,0,0,0,1,1,1,0,0,0};
weak[2] = new int[]{0,1,1,0,1,0,0,0,0,0,0,0,0};
weak[3] = new int[]{0,1,0,0,1,1,0,0,1,0,1,0,0};
weak[4] = new int[]{0,1,0,0,1,1,0,0,1,1,1,0,0};
weak[5] = new int[]{0,0,0,0,0,0,0,0,0,0,1,0,0};
weak[6] = new int[]{0,0,0,0,0,0,0,1,1,1,0,0,0};
weak[7] = new int[]{0,0,0,0,0,0,0,1,1,0,0,0,0};
System.out.println(maxArea(weak));
}
// 先每行遍历,当节点为1进入计算面积方法.
// 计算面积方法计算完面积则将该地方置为0
// 从当前点向上下左右进行面积计算
public static Integer maxArea(int[][] weak){
int maxArea = 0;
if(weak.length < 1){
return maxArea;
}
// 纵向遍历
for(int i=0; i < weak.length; i++){
// 横向遍历
for(int j=0; j < weak[i].length; j++){
// 当该节点出现岛屿时,执行计算面积方法.计算面积方法向该点的四面八方搜索
if(weak[i][j] == 1){
maxArea = Math.max(maxArea, search(weak, i, j));
}
}
}
return maxArea;
}
/**
*
* @param weak 湖
* @param i 纵坐标
* @param j 横坐标
* @return
*/
private static Integer search(int[][] weak, int i, int j){
if(weak[i][j] ==0){
return 0;
}
int currentArea = 1;
// 将当前节点置为0,毕竟已经搜索过了算在这个岛的面积上了.就不在另一个岛上计算了
weak[i][j] = 0;
// 向上
if(i-1 >= 0){
currentArea = currentArea + search(weak, i-1, j);
}
// 向下
if(i+1 < weak.length){
currentArea = currentArea + search(weak, i+1, j);
}
// 向前
if(j-1 >= 0){
currentArea = currentArea + search(weak, i, j-1);
}
// 向后
if(j+1 < weak[i].length){
currentArea = currentArea + search(weak, i, j+1);
}
return currentArea;
}
} 
京公网安备 11010502036488号