解题思路:
递归+沉岛思想
当前元素是1,如果是第一次遇到,把当前元素置为0,保证下次递归的时候不被访问。
类比leetcode 200,解题思路相同
public static void main(String[] args) {
int[][] grid = {{0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0},
{0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}};
int num = maxAreaOfIsland(grid);
System.out.println(num);
}
/**
* leetcode 695. 岛屿的最大面积
* dfs 递归 搜索,使用沉船的思想,第一次遇到就把当前的位置置为0,保证下次来到的时候不会重复访问
* 参考: https://leetcode-cn.com/problems/max-area-of-island/solution/biao-zhun-javadong-tai-gui-hua-jie-fa-100-by-mark-/
* @Date: 2020/5/25 13:46
* @Author: fuguowen
* @Return
* @Throws
*/
public static int maxAreaOfIsland(int[][] grid) {
int max = 0;
/** 遍历所有的方格 */
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
/** 更新最大值 */
max = Math.max(max, dfs(grid, i, j));
}
}
return max;
}
public static int dfs(int[][] grid, int i, int j) {
/** 数组下标越界 或者当前的位置为0 直接返回0 */
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) {
return 0;
}
/** 如果当前的岛屿为1,把当前的岛屿置沉 */
grid[i][j] = 0;
/** 递归处理,相邻的四个位置 上下左右 */
return 1 + dfs(grid, i, j + 1) + dfs(grid, i + 1, j) + dfs(grid, i - 1, j) + dfs(grid, i, j - 1);
}