leetcode 200. 岛屿数量

见注释

"""
# 参考题解排在第四的解法。
# 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

你可能感兴趣的:(leetcode 200. 岛屿数量)