簡體   English   中英

Python3 - 島嶼數量 - LeetCode 問題

[英]Python3 - Number of islands - LeetCode question

我正在嘗試解決這個 leetcode 問題: https://leetcode.com/problems/number-of-islands/

    visited: List[List[int]] = None
    def numIslands(self, grid: List[List[str]]) -> int:
        self.visited = [[0] * len(grid[0])] * len(grid)
        m, n = 0, 0
        islands = 0
        while m < len(grid):
            while n < len(grid[0]):
                print(m,n)
                islands = self.recur(grid,m,n,islands)
                n = n + 1
            m = m +1
        return islands
        
    def recur(self, grid: List[List[str]],m: int, n: int, islands: int) -> int:
        print(m,n,grid[m][n])
        if grid[m][n] == "1" and self.visited[m][n] == 0:
            down, right = None, None
            if m < len(grid) - 1:
                down = self.recur(grid,m+1, n, islands)
            if n < len(grid[0]) - 1:
                right = self.recur(grid,m, n+1, islands)
            
            if right is not None and down is not None:
                islands = min(islands,down,right) + 1
            elif right is not None:
                islands = min(islands,right) + 1
            elif down is not None:
                islands = min(islands,down) + 1
            else:
                islands = islands + 1
        self.visited[m][n] = 1
        print(self.visited)
        return islands

我的想法是使用遞歸,如果遇到 1 繼續向下然后向右直到遇到零。 我想使用一個visited的變量來跟蹤grid中所有已經訪問過的值並跳過這些值的遞歸。

但我注意到在visited中更新了錯誤的單元格:

對於第一次迭代,m = 0 和 n = 0,這里是 output:

0 0
0 0 1
1 0 1
2 0 1
3 0 0
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
2 1 1
3 1 0
[[1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [1, 1, 0, 0, 0]]
2 2 0
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
1 1 1
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
0 1 1
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]
[[1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]]

每次調用recur方法時,所有 3 位線都表示mngrid[m][n]值。 我在方法結束時打印visited的內容。 我注意到未訪問的mn值也在visited中更新為1

我無法弄清楚為什么會發生這種情況,這給了我錯誤的結果。 任何幫助,將不勝感激。

self.visited = [[0] * len(grid[0])] * len(grid)會給你帶來問題。 像這樣初始化二維數組會導致在列表項中引用相同的可變 object (在本例中為[0] )。 換句話說,修改visited[0][0]會改變visited[0]中的所有元素。

嘗試這樣的事情:

visited = [['0'] * len(grid[0]) for _ in range(len(grid))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM