0
点赞
收藏
分享

微信扫一扫

leetcode:黄金矿工

其生 2022-02-05 阅读 70

在这里插入图片描述
dfs+回溯 46/51 还是超时 almost

class Solution:
    def getMaximumGold(self, grid: List[List[int]]) -> int:
        # bfs不同的起点?
        ans = 0
        m = len(grid)
        n = len(grid[0])
        
        def dfs(pos, sum):
            nonlocal ans
            nonlocal visit
            x, y = pos
            sum += grid[x][y]
            if sum > ans:
                #print(sum)
                ans = sum
            visit[x][y] = True
            # record the visit
            myVisit = copy.deepcopy(visit)

            X = [-1, 0, 1, 0]
            Y = [0, -1, 0 ,1]
            for i in range(4):
                nextX = x + X[i]
                nextY = y + Y[i]
                #print(nextX, nextY)
                if 0 <= nextX < m and 0 <= nextY < n and grid[nextX][nextY] != 0 and visit[nextX][nextY] is False:
                    
                    dfs([nextX, nextY], sum)
                    # 回溯
                    visit = copy.deepcopy(myVisit)
        
        #sum = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 0:
                    continue
                #sum += grid[i][j]
                visit = [[False] * n for _ in range(m)]
                dfs([i, j], 0)
        
        #print(sum)
        return ans

正确做法:不用visit
因为用了visit之后回溯的非常慢,要把dfs更改的visit全部去掉
这里采用原地修改的方法为0的方法封路,遍历完四个方向之后解除封锁

class Solution:
    def getMaximumGold(self, grid: List[List[int]]) -> int:
        # bfs不同的起点?
        ans = 0
        m = len(grid)
        n = len(grid[0])
        
        def bfs(pos, sum):
            nonlocal ans
            nonlocal visit
            x, y = pos
            sum += grid[x][y]
            if sum > ans:
                #print(sum)
                ans = sum
            visit[x][y] = True
            # record the visit
            myVisit = copy.deepcopy(visit)

            X = [-1, 0, 1, 0]
            Y = [0, -1, 0 ,1]
            for i in range(4):
                nextX = x + X[i]
                nextY = y + Y[i]
                #print(nextX, nextY)
                if 0 <= nextX < m and 0 <= nextY < n and grid[nextX][nextY] != 0 and visit[nextX][nextY] is False:
                    
                    bfs([nextX, nextY], sum)
                    # 回溯
                    visit = copy.deepcopy(myVisit)
        
        #sum = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 0:
                    continue
                #sum += grid[i][j]
                visit = [[False] * n for _ in range(m)]
                bfs([i, j], 0)
        
        #print(sum)
        return ans

总结:
回溯不一定要更改visit数组
可以原地修改成封锁的路,后面dfs完上下左右再解封!

举报

相关推荐

0 条评论