我正在尝试解决名为Number of Islands的leetcode问题
给出一个二维地图,分别是“ 1”(土地)和“ 0”(水),计算岛屿的数量。一个岛屿被水包围,是通过水平或垂直连接相邻的陆地而形成的。您可能会假设网格的所有四个边缘都被水包围了。
class Solution(object):
def numIslands(self, grid):
if len(grid) == 0 or len(grid[0]) == 0:
return 0
visited = [[False]*len(grid[0])]*len(grid)
count = 0
grid = [[int(k) for k in item] for item in grid]
for i in range(0, len(grid)):
for j in range(0, len(grid[0])):
if visited[i][j] == False and grid[i][j] == 1:
print('new island---->', i, j)
count = count+1
self.dfs(grid, visited, i, j)
def dfs(self, grid, visited, i, j):
if i >= len(grid) or j >= len(grid[0]):
return
elif grid[i][j] == 0:
return
else:
visited[i][j] = True
self.dfs(grid, visited, i+1, j)
self.dfs(grid, visited, i, j+1)
由于某种原因,在每次dfs调用之后,我访问过的矩阵的整个列都设置为true。我不确定为什么以及这里出了什么问题
答案 0 :(得分:2)
请注意,将列表相乘会创建对相关列表的多个引用,而不是多个副本。因此[x] * 2
产生[x, x]
而不是[copy.copy(x), copy.copy(x)]
,如果x
是可变的,这是一个重要的区别。因此,在初始化visited
时,您将要使用列表推导而不是列表乘法:[[False for _ in range(len(grid[0]))] for _ in range(len(grid))]
。这将为每个元素创建一个新列表。
由于False
是不可变的,因此您可以避免对内部列表([[False] * len(grid[0]) for _ in range(len(grid))]
)使用乘法,但是最好养成前者的习惯。