岛屿的最大面经

695. 岛屿的最大面积 - 力扣(LeetCode)

给你一个大小为 m x n 的二进制矩阵 grid

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

示例 1:

img
1
2
3
输入: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]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1

示例 2:

1
2
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • grid[i][j]01

DFS

使用count记录岛屿的计数,在DFS的过程中能够每访问一个有效岛屿就+1,一次DFS可以得到该岛屿的大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
int max_count = 0;
int count = 0;

public int maxAreaOfIsland(int[][] grid) {
int[][] visited = new int[grid.length][grid[0].length];//标记该坐标是被访问过

for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[i].length; j++){
if(grid[i][j] == 1 && visited[i][j] == 0){//遇到了岛屿且没被访问过
count = 0; //
dfs(grid, visited, i, j); //从坐标(i,j)开始dfs
max_count = Math.max(max_count, count);
}
}
}
return max_count;
}

//使用一个count作为参数记录递归过程中访问的最大深度,即岛屿的面积
public void dfs(int[][] grid, int[][] visited, int x, int y){
//越界或者该节点已被访问,或遇到到了非岛屿,直接return
if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || visited[x][y] == 1 || grid[x][y] == 0){
return;
}

visited[x][y] = 1; //访问该节点
count ++;
dfs(grid, visited, x - 1, y); //向上
dfs(grid, visited, x , y - 1); //向左
dfs(grid, visited, x + 1, y); //向下
dfs(grid, visited, x , y + 1); //向右

}
}

BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
Queue<int[]> q = new LinkedList<>();
int[][] move = {{0, 1},
{0, -1},
{1, 0},
{-1, 0}}; //向四个方向移动

int count = 0;

public int maxAreaOfIsland(int[][] grid) {
int max_count = 0;
int[][] visited = new int[grid.length][grid[0].length];//标记该坐标是被访问过

for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[i].length; j++){
if(grid[i][j] == 1 && visited[i][j] == 0){//遇到了岛屿且没被访问过,入队并访问
q.offer(new int[] {i, j});
visited[i][j] = 1; //访问该节点
count = 1;
bfs(grid, visited); //从坐标(i,j)开始bfs
max_count = Math.max(max_count, count);
}
}
}
return max_count;
}


public void bfs(int[][] grid, int[][] visited){

while(!q.isEmpty()){ //队列不为空,出队,将该节点附近符合要求的节点入队并访问
int[] pos = q.poll();
int x = pos[0];
int y = pos[1];

for(int i = 0; i < 4; i++){
int next_x = x + move[i][0];
int next_y = y + move[i][1];
if(next_x < 0 || next_y < 0 || next_x >= grid.length || next_y >= grid[0].length){
continue;
}
if(visited[next_x][next_y] == 0 && grid[next_x][next_y] == 1){
q.offer(new int[] {next_x, next_y});
visited[next_x][next_y] = 1;
count ++;
}
}
}
}
}

岛屿的最大面经
http://example.com/2023/09/17/算法/图/3. 岛屿的最大面积/
作者
PALE13
发布于
2023年9月17日
许可协议