695. 岛屿的最大面积 - 力扣(LeetCode)
发布:2021年9月8日16:32:33
问题描述及示例
给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
示例 1:
[
[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:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
提示:
- 注意: 给定的矩阵grid 的长度和宽度都不超过 50。
我的题解
这道题和我之前做的一道岛屿问题也是相同的套路。只需要在那道题的基础上做一点小小的修改即可。
目前来看,岛屿问题的套路差不多就是这种模式了。关键是抓住深度优先遍历的要领:尽可能探索相邻的点。
我的题解1(深度优先搜索/DFS—递归)
主要的思路和我上面提到的那道题是完全一致的,只是稍稍增加了一个用来记录某个岛屿面积的变量 area
,并且让 result
由原来的用于记录岛屿数量改为用于保存当前最大的岛屿面积。其他逻辑完全没变。
当然也要注意 area
的被访问范围问题,一定要在用area记录下一个岛屿面积之前将area的值归零。
/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function(grid) {
// result不再用来存储岛屿的数量了,而是用于动态存储最大的岛屿面积
let result = 0;
// 增加的area变量用于记录某个岛屿的面积,注意它是不断更新的
let area = 0;
let visited = Array.from({ length: grid.length }).map(
() => Array.from({ length: grid[0].length }).fill(false)
);
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (!visited[i][j] && grid[i][j] === 1) {
gridDFS(grid, i, j, visited);
// gridDFS执行完之后说明找到了一座岛屿,且全局变量area中已经存储了该岛屿的面积
// 只要取result和area中的较大值赋值给result就能保证result保存的是最大的岛屿面积
result = Math.max(result, area);
// 因为area对于gridDFS函数来说是全局的,所以在用area记录下一个岛屿面积之前
// 一定要记得将area的值归零,否则等遍历完grid之后,area就将记录所有岛屿的总面积
area = 0;
}
}
}
return result;
function gridDFS(grid, row, col) {
if (!inGrid(grid, row, col) || visited[row][col] || grid[row][col] === 0) {
return;
}
visited[row][col] = true;
area++;
gridDFS(grid, row - 1, col);
gridDFS(grid, row + 1, col);
gridDFS(grid, row, col - 1);
gridDFS(grid, row, col + 1);
}
function inGrid(grid, row, col) {
return 0 <= row && row < grid.length && 0 <= col && col < grid[0].length;
}
};
提交记录
728 / 728 个通过测试用例
状态:通过
执行用时:108 ms, 在所有 JavaScript 提交中击败了23.67%的用户
内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了25.00%的用户
时间:2021/09/08 16:35
可以看到这种解法的时间表现和空间表现都不怎么好。我觉得主要还是因为递归的性能太差了,没办法。
至于空间优化其实也可以参照我上面的那篇题解博客中所说的,但是我个人觉得还是尽量不要修改原来的数组得好,所以就不做空间优化了。
官方题解
更新:2021年7月29日18:43:21
因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。
更新:2021年9月8日16:39:19
【更新结束】
有关参考
更新:2021年9月8日16:41:27
参考:【算法-LeetCode】200. 岛屿数量(深度优先搜索/DFS)_赖念安的博客-CSDN博客
更新:2021年9月8日13:57:03
参考:岛屿类问题的通用解法、DFS 遍历框架 - 岛屿数量 - 力扣(LeetCode)
参考:200. 岛屿数量(DFS / BFS) - 岛屿数量 - 力扣(LeetCode)
参考:岛屿类问题通用解法:DFS_Tim_Coder的博客-CSDN博客_岛屿问题dfs
参考:深度优先搜索dfs《岛屿问题》(共四题)_wuyouyin123的博客-CSDN博客_岛屿问题dfs
参考:基本算法——深度优先搜索(DFS)和广度优先搜索(BFS) - 简书