題目鏈接:695. 島嶼的最大面積
給定一個包含了一些 0 和 1 的非空二維數組 grid 。
一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。
找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)
示例 1:
[[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]]
對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因爲島嶼只能包含水平或垂直的四個方向的 1 。
示例 2:
[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回 0。
程序說明:
和POJ2386 Lake Counting差不多,結果還把兩個題混淆了。。這道題是上下左右四個方向。注意dfs要把記錄過的點變成1,不然會棧溢出。
代碼如下:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int res = 0;
for(int i = 0; i < grid.length; i++)
for(int j = 0; j < grid[i].length; j++)
if(grid[i][j] == 1)
res = Math.max(res, dfs(i, j, grid));
return res;
}
public int dfs(int x, int y, int[][] grid) {
if(x < 0 || y < 0 || x >= grid.length || y >= grid[x].length
|| grid[x][y] == 0) {
return 0;
}
grid[x][y] = 0; //清除
int cnt = 1;
cnt += dfs(x + 1, y, grid);
cnt += dfs(x - 1, y, grid);
cnt += dfs(x, y + 1, grid);
cnt += dfs(x, y - 1, grid);
return cnt;
}
}