LeetCode 695.岛屿的最大面积

695.岛屿的最大面积

题目描述

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

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

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

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

LeetCode 695.岛屿的最大面积_第1张图片

解题思路

思路一:DFS(深度优先搜索)

只需要对每个岛屿做 DFS 遍历,求出每个岛屿的面积就可以了。求岛屿面积的方法:每遍历到一个格子,就把面积加一。
实现代码如下:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function(grid) {
    let result = 0, rowLen = grid.length, colLen = grid[0].length;

    const dfs = function (row, col) {
        if (row < 0 || row >= rowLen || col < 0 || col >= colLen || grid[row][col] == 0) {
            return 0;
        }
        grid[row][col] = 0; // 沉没
        let count = 1;

        count += dfs(row, col - 1);
        count += dfs(row - 1, col);
        count += dfs(row + 1, col);
        count += dfs(row, col + 1);
        return count;
    }

    for (let row = 0; row < rowLen; row++) {
        for (let col = 0; col < colLen; col++) {
            if (grid[row][col] == 1) {
                
                const count = dfs(row, col);
                result = Math.max(result, count);
            }
        }
    }

    return result; 
};
  • 时间复杂度:O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。

  • 空间复杂度:O(m×n),递归的深度最大可能是整个网格的大小,因此最大可能使用 O(m×n) 的栈空间。

思路二: BFS(广度优先遍历)

每次从队首取出土地,并将接下来想要遍历的土地放在队尾,就实现了广度优先搜索算法
实现代码如下:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function(grid) {
    let result = 0, rowLen = grid.length, colLen = grid[0].length;

    const bfs = function (i, j) {
        let queue = [], count = 0;
        queue.push({row: i, col: j});
        while(queue.length) {
            let {row, col} = queue.shift();
        
            if (row >= 0 && row < rowLen && col >= 0 && col < colLen && grid[row][col] == 1) {
                grid[row][col] = 0; // 沉没
                count++;
                count += bfs(row, col - 1);
                count += bfs(row - 1, col);
                count += bfs(row + 1, col);
                count += bfs(row, col + 1);
            }
        }
        return count;
    }

    for (let row = 0; row < rowLen; row++) {
        for (let col = 0; col < colLen; col++) {
            if (grid[row][col] == 1) { 
                const count = bfs(row, col);
                result = Math.max(result, count);
            }
        }
    }

    return result; 
};
  • 时间复杂度: O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。

  • 空间复杂度: O(m×n),队列中最多会存放所有的土地,土地的数量最多为 m×n 块,因此使用的空间为 O(m×n)

参考资料

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

你可能感兴趣的:(LeetCode,leetcode,深度优先)