[英]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 位線都表示m
、 n
和grid[m][n]
值。 我在方法結束時打印visited
的內容。 我注意到未訪問的m
, n
值也在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.