V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vthe
V2EX  ›  问与答

Python 写力扣每日一题时遇到的困惑

  •  
  •   vthe · 311 天前 · 742 次点击
    这是一个创建于 311 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面两种代码基本是一样的,但是第一种会出现错误的答案。

    在写这种 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]
    
    3 条回复    2023-06-22 22:26:13 +08:00
    NoOneNoBody
        1
    NoOneNoBody  
       311 天前
    定义域
    第一个的 for (i,j) in tmp 这句
    换其他变量,如 ii, jj ,当然循环内也要跟着换
    NoOneNoBody
        2
    NoOneNoBody  
       311 天前
    补充:
    在 bfs(i,j),land[i][j] = 1 这句后,i,j 的传参工作就完成了,后面 for 重新定义复用 i,j 并不影响计算

    但在第一例,for (i,j) in tmp 的 i,j 是影响外部循环的 i,j 的
    vthe
        3
    vthe  
    OP
       311 天前
    明白了,谢谢您
    ```
    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 都找不到。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3093 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:28 · PVG 20:28 · LAX 05:28 · JFK 08:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.