见注释
"""
# 参考题解排在第四的解法。
# see: https://leetcode-cn.com/problems/number-of-islands/solution/shen-du-you-xian-sou-suo-xi-wang-da-jia-xi-huan-by/
# 然后自己再来尝试一下。
"""
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
"""
通过这道题,我学到了: 二维数组尽量不要使用 pop(0),而要尽量使用 pop(),本题我就卡在第20行。
(也想借鉴评论区 使用 visited = set(), 但是最终结果不正确。)
因为你拿掉了第一个元素,那么后面所有的元素索引都要修改。那样的话,效率非常低下。
这个flood 函数,目就算把一块陆地四周与之相连的部分都变成不相干的部分。作为后面排除来用。
"""
# 评论区深度优先大多使用的都是递归,我还是觉得遍历比较容易理解一些。
def flood(i, j):
# 这里有人用 collections.deque(), queue.Queue()
stack = [(i, j)]
# stack = deque([i, j]) # 解包的时候报错。
# 如果当前这个格子是 "1",那就把它变成"2",
# 然后检查它的上下左右,如果它的上下左右等于"1",那就加入到队列当中。
while stack:
i, j = stack.pop()
if grid[i][j] == "1":
grid[i][j] = "2"
# 需要添加边界。
# 上方
if i > 0 and grid[i-1][j] == "1":
stack.append([i-1, j])
# 下方
if i+1 < len(grid) and grid[i + 1][j] == "1":
stack.append([i + 1, j])
# 左侧
if j > 0 and grid[i][j-1] == "1":
stack.append([i, j-1])
# 右侧
if j+1 < len(grid[i]) and grid[i][j + 1] == "1":
stack.append([i, j + 1])
# print(grid)
ret = 0
for m in range(len(grid)):
for n in range(len(grid[m])):
if grid[m][n] == "1":
ret += 1
flood(m, n)
return ret
网友评论