LeetCode热题(JS版) - 695. 岛屿的最大面积

182 阅读2分钟

题目描述

给定一个由0和1组成的二维数组,其中1代表陆地,0代表水域。计算最大岛屿面积,岛屿被水域包围。

示例

示例1:

image.png

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;
}

复杂度

  • 时间复杂度为O(mn)O(mn)。遍历整个二维数组需要花费O(mn)O(mn)的时间,对于每个陆地位置,我们最多会访问它周围的四个位置,因此深度优先搜索的时间复杂度为O(1)O(1)

  • 空间复杂度为O(mn)O(mn)。我们定义了一个m×nm\times n的visit数组来记录每个位置是否被访问过,以及在深度优先搜索中,递归调用栈最多有O(mn)O(mn)个函数调用。因此,总的空间复杂度为O(mn)O(mn)