下面两种代码基本是一样的,但是第一种会出现错误的答案。
在写这种 bfs 之类的题目时,我经常会遇到这个问题。
其实我大概知道原因,就是变量自动变了,但还是很困惑,不知道到底是哪里变的。
class Solution:
def pondSizes(self, land: List[List[int]]) -> List[int]:
m = len(land)
n = len(land[0])
res = []
for i,row in enumerate(land):
for j, v in enumerate(row):
if v == 0:
q = [(i,j)]
land[i][j] = 1
cnt = 1
while q:
# print(q)
tmp = q
q = []
for (i,j) in tmp:
for dx in range(-1,2):
for dy in range(-1,2):
if dx == dy == 0:
continue
x = i + dx
y = j + dy
if 0 <= x < m and 0 <= y < n and land[x][y] == 0:
cnt += 1
q.append((x,y))
land[x][y] = 1
res.append(cnt)
return sorted(res)
print(Solution().pondSizes([[0,2,1,0],[0,1,0,1],[1,1,0,1],[0,1,0,1]]))
[1, 2, 5]
class Solution:
def pondSizes(self, land: List[List[int]]) -> List[int]:
m = len(land)
n = len(land[0])
def bfs(i,j):
q = [(i,j)]
land[i][j] = 1
cnt = 1
while q:
# print(q)
tmp = q
q = []
for (i,j) in tmp:
for dx in range(-1,2):
for dy in range(-1,2):
if dx == dy == 0:
continue
x = i + dx
y = j + dy
if 0 <= x < m and 0 <= y < n and land[x][y] == 0:
cnt += 1
land[x][y] = -1
q.append((x,y))
return cnt
res = []
for i,row in enumerate(land):
for j, v in enumerate(row):
if v == 0:
cnt = bfs(i,j)
res.append(cnt)
return sorted(res)
print(Solution().pondSizes([[0,2,1,0],[0,1,0,1],[1,1,0,1],[0,1,0,1]]))
[1, 2, 4]
1
NoOneNoBody 162 天前
定义域
第一个的 for (i,j) in tmp 这句 换其他变量,如 ii, jj ,当然循环内也要跟着换 |
2
NoOneNoBody 162 天前
补充:
在 bfs(i,j),land[i][j] = 1 这句后,i,j 的传参工作就完成了,后面 for 重新定义复用 i,j 并不影响计算 但在第一例,for (i,j) in tmp 的 i,j 是影响外部循环的 i,j 的 |
3
vthe OP 明白了,谢谢您
``` for i,row in enumerate(land): for j, v in enumerate(row): if v == 0: q = [(i,j)] for (i,j) in tmp: ``` 最主要的问题就是这里 `for (i,j) in tmp`,虽然 `for j, v in enumerate(row)`可以正常运行,但是`i`的值会和`for (i,j) in tmp`这里的最后一个`i`值相同,所以造成了错误。 其他语言`for (i,j) in tmp:`这里的`i,j` 一般是局部的,python 虽然方便,但是出现问题是真的麻烦,找 bug 都找不到。 |