695. 岛屿的最大面积
给你一个大小为
m x n
的二进制矩阵grid
。
岛屿 是由一些相邻的1
(代表土地) 构成的组合,这里的「相邻」要求两个1
必须在 水平或者竖直的四个方向上 相邻。你可以假设grid
的四个边缘都被0
(代表水)包围着。
岛屿的面积是岛上值为1
的单元格的数目。
计算并返回grid
中最大的岛屿面积。如果没有岛屿,则返回面积为0
。
示例一:
输入: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 。
示例二:
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
解题方法:DFS
class Solution {
func dfs(_ grid: inout [[Int]], _ row: Int, _ col: Int) -> Int {
if row < 0 || col < 0 || row == grid.count || col == grid[0].count || grid[row][col] != 1 {
return 0
}
grid[row][col] = 0
var ans = 1
let dRow = [0, 0, 1, -1]
let dCol = [1, -1, 0, 0]
for i in 0..<4 {
let nextRow = row + dRow[i]
let nextCol = col + dCol[i]
ans += dfs(&grid, nextRow, nextCol)
}
return ans
}
func maxAreaOfIsland(_ grid: [[Int]]) -> Int {
var grid = grid
var ans = 0
for row in 0..<grid.count {
for col in 0..<grid[0].count {
ans = max(ans, dfs(&grid, row, col))
}
}
return ans
}
}
解题思路
- 我们想知道网格中每个连通形状的面积,然后取最大值。
- 如果我们在一个土地上,以
4
个方向探索与之相连的每一个土地(以及与这些土地相连的土地),那么探索过的土地总数将是该连通形状的面积。 - 为了确保每个土地访问不超过一次,我们每次经过一块土地时,将这块土地的值置为
0
。这样我们就不会多次访问同一土地。
复杂度分析
- 时间复杂度:
O(R×C)
。其中R
是给定网格中的行数,C
是列数。我们访问每个网格最多一次。 - 空间复杂度:
O(R×C)
,递归的深度最大可能是整个网格的大小,因此最大可能使用O(R×C)
的栈空间。