持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情.
695.岛屿的最大面积
题目描述
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
解题思路
思路一: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)