思路
遇到一个1后,计数+1,继续搜,每遇到一个1,计数+1,直到搜不到。
方法一: DFS
思路:每调用一次DFS函数,说明又找到了一个1,计数+1,直到:
- 超出边界
- 搜到的不是1.
class Solution {
int max = 0;
int curMax = 0;
public int maxAreaOfIsland(int[][] grid) {
int width = grid.length;
int length = grid[0].length;
for (int i = 0; i < width; i++) {
for (int j = 0; j < length; j++) {
if (grid[i][j] == 1) {
dfs(i, j, grid);
curMax = 0;
}
}
}
return max;
}
public void dfs(int i, int j, int[][] grid) {
if (i >= grid.length || j >= grid[0].length || i < 0 || j < 0 || grid[i][j] != 1) {
return;
}
grid[i][j] = 2;//置为2的话如果想复原原数组,可以再遍历复原,置为0 就找不回来了
curMax++;
max = Math.max(curMax, max);
dfs(i, j + 1, grid);
dfs(i, j - 1, grid);
dfs(i + 1, j, grid);
dfs(i - 1, j, grid);
//curMax = 0; 在这里归零是错的,因为dfs并没有结束,
//上面的四个dfs的后面,并不一定是最外层的走完了,可能是里层调用的四个dfs走完了
//因此应该在最外层后再置零,即在上面dfs(i, j, grid)处
}
}
方法二:BFS
思路:每加一个元素到队列,计数+1
错误做法
class Solution {
int max = 0;
public int maxAreaOfIsland(int[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) {
dfs(grid, i, j, 0);
}
}
}
return max;
}
public void dfs(int[][] grid, int i, int j, int curMax) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != 1) {
return;
}
grid[i][j] = 2;
max = Math.max(max, curMax + 1);
dfs(grid, i + 1, j, curMax + 1);
dfs(grid, i - 1, j, curMax + 1);
dfs(grid, i, j + 1, curMax + 1);
dfs(grid, i, j - 1, curMax + 1);
}
}