题目描述
给定一个由0和1组成的二维数组,其中1代表陆地,0代表水域。计算最大岛屿面积,岛屿被水域包围。
示例
示例1:
Input:
[[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]]
Output: 6
Explanation: 在上面的网格中,岛屿的最大面积为6。请注意,每个岛屿可以通过水平或垂直移动连接。
示例2:
luaCopy code
Input:
[[0,0,0,0,0,0,0,0]]
Output: 0
Explanation: 在上面的网格中,没有岛屿。
解法
我们可以使用深度优先搜索来解决这个问题。对于每个位置,如果它是陆地并且未被访问过,那么我们就从这个位置开始进行一次深度优先搜索,并计算从该位置可以扩展出的最大岛屿面积。具体实现时,我们可以定义一个visit数组记录每个位置是否被访问过,然后遍历整个二维数组,对于任何未被访问过的陆地位置,我们就以它为起点进行一次深度优先搜索。
在搜索过程中,我们需要注意避免重复访问以及数组越界的情况。同时,我们还需要记录当前搜索区域的面积,并与已经找到的最大岛屿面积进行比较,以便更新最大值。
代码
function maxAreaOfIsland(grid: number[][]): number {
const m = grid.length;
const n = grid[0].length;
const visit: boolean[][] = Array.from({length: m}, () => new Array(n).fill(false));
let maxArea = 0;
// 深度优先搜索
function dfs(i: number, j: number): number {
if (i < 0 || i >= m || j < 0 || j >= n || visit[i][j] || grid[i][j] === 0) {
return 0;
}
visit[i][j] = true;
let area = 1 + dfs(i - 1, j) + dfs(i + 1, j) + dfs(i, j - 1) + dfs(i, j + 1);
return area;
}
// 遍历整个数组
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (!visit[i][j] && grid[i][j] === 1) {
maxArea = Math.max(maxArea, dfs(i, j));
}
}
}
return maxArea;
}
复杂度
-
时间复杂度为。遍历整个二维数组需要花费的时间,对于每个陆地位置,我们最多会访问它周围的四个位置,因此深度优先搜索的时间复杂度为。
-
空间复杂度为。我们定义了一个的visit数组来记录每个位置是否被访问过,以及在深度优先搜索中,递归调用栈最多有个函数调用。因此,总的空间复杂度为。