刷题使我快乐,满脸开心.jpg
- 来源:力扣(LeetCode)
- 链接:https://leetcode.cn/problems/max-area-of-island/
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给你一个大小为 m x n
的二进制矩阵 grid
。
岛屿 是由一些相邻的 1
(代表土地) 构成的组合,这里的「相邻」
要求两个 1
必须在 水平或者竖直的四个方向上
相邻。你可以假设 grid
的四个边缘都被 0
(代表水)包围着。
岛屿的面积是岛上值为 1
的单元格的数目。
计算并返回 grid
中最大的岛屿面积。如果没有岛屿,则返回面积为 0
。
示例 1:
输入:grid = [[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:
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j]
为0
或1
思路
这道题其实应该算是比较简单的了,感觉需要说的重点就在于如何记录已经遍历过
这个点了
通常做法可能是维护一个是否遍历的矩阵,但是其实这道题的情况下会有一个更取巧的做法:
可以把
已经记入某个岛屿
的方块值置为 0
这样一来,就可以不需要额外的空间来做记录了。
剩下的感觉没太多要说的了。
代码
func maxAreaOfIsland(grid [][]int) int {
res := 0
m := len(grid)
n := len(grid[0])
var find func(x, y int) int
find = func(x, y int) int {
if x < 0 || x >= m || y >= n || y < 0 || grid[x][y] == 0 {
return 0
}
// 四个方向遍历,记入面积并将当前位置值记为0
grid[x][y] = 0
return 1 + find(x-1, y) + find(x, y-1) + find(x+1, y) + find(x, y+1)
}
temp := 0
// 一个个坐标遍历,发现 1 进入计算面积逻辑
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if grid[i][j] == 1 {
// 遍历完此岛屿,则比较面积大小更新最大面积数
temp = find(i, j)
if temp > res {
res = temp
}
}
}
}
return res
}