Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.
Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)
Example 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]]
Given the above grid, return 6
. Note the answer is not 11, because the island must be connected 4-directionally.
Example 2:
[[0,0,0,0,0,0,0,0]]
Given the above grid, return 0
.
Note: The length of each dimension in the given grid does not exceed 50.
應(yīng)該說是基礎(chǔ)的DFS題,但是巨久沒有寫搜索了,感覺完全不會BFS和DFS了。做完了contest第二天看了下答案,發(fā)現(xiàn)跟Number of islands這種題完全就是一樣的套路,感覺最近必須得回歸基礎(chǔ)了。別去搞什么太fancy的東西,講真那些高大上的項(xiàng)目寫在簡歷上,真有那個水平早就在工業(yè)界拿高薪了,怎么可能還在找實(shí)習(xí)?;貧w算法和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),做好基礎(chǔ)題,熟悉基礎(chǔ)套路,我覺得完全夠了。
這道題用的是DFS, 具體為灌水法。我們用兩個for循環(huán)搜索grid, 每次遇到0就continue; 遇到1就進(jìn)行DFS, 然后更新當(dāng)前的maxArea. DFS返回的是當(dāng)前grid[i][j]所在島嶼的最大面積。我們先判斷該點(diǎn)是否在規(guī)定范圍內(nèi),然后將grid[i][j] == 1的點(diǎn)先標(biāo)為0,就好像是吃掉了這個島。同時,我們也要對這個點(diǎn)周圍四個方向的點(diǎn)進(jìn)行DFS搜索,將所有鏈接起來的島標(biāo)為0,形象地比喻就好像灌水一樣,一口吃掉所有連接的島。我們返回的時候,要返回上下左右所有DFS的值之和加上1. 如果grid[i][j] == 0,則DFS method直接返回0.
class Solution {
public int n;
public int m;
public int maxAreaOfIsland(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
}
n = grid.length;
m = grid[0].length;
int maxArea = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (grid[i][j] == 0){
continue;
} else {
maxArea = Math.max(maxArea, dfsHelper(grid,i,j));
}
}
}
return maxArea;
}
private int dfsHelper(int[][] grid, int i, int j){
if (i < 0 || i >= n || j < 0 || j >= m || grid[i][j] == 0){
return 0;
}
if (grid[i][j] == 1){
grid[i][j] = 0;
return 1 + dfsHelper(grid,i, j - 1) + dfsHelper(grid,i - 1, j) + dfsHelper(grid,i, j + 1) + dfsHelper(grid,i + 1, j);
}
return 0;
}
}