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]]
给一个数组,求4邻域方向连接的1的最大个数
思路:
DFS,访问过的置true,后面不再访问,深度搜索4邻域内1的个数,注意出边界时直接返回个数0
public int maxAreaOfIsland(int[][] grid) {
if(grid == null || grid.length == 0) {
return 0;
}
int m = grid.length;
int n = grid[0].length;
boolean[][] visited = new boolean[m][n];
int count = 0;
int result = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
count = dfs(grid, visited, i, j, m, n);
result = Math.max(result, count);
}
}
return result;
}
int dfs(int[][] grid, boolean[][] visited, int r, int c, int m, int n) {
if(r < 0 || c < 0 || r >= m || c >= n) {
return 0;
}
if(grid[r][c] == 0 || visited[r][c]) {
return 0;
}
int count = 1;
visited[r][c] = true;
count += dfs(grid, visited, r-1, c, m, n);
count += dfs(grid, visited, r, c-1, m, n);
count += dfs(grid, visited, r, c+1, m, n);
count += dfs(grid, visited, r+1, c, m, n);
return count;
}