解題思路:
遞歸+沉島思想
當前元素是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);
}