5548. 最小体力消耗路径

你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。

一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。

请你返回从左上角走到右下角的最小 体力消耗值 。

示例 1:

1.BFS,记忆化

2.二分答案,用答案对图做剪枝条件,10**7


class Solution:
    def minimumEffortPath(self, heights: List[List[int]]) -> int:
        que=deque([[0,0,0]])
        t=[[float('inf')]*len(i) for i in heights]
        t[0][0]=0
        while que:
            i,j,k=que.popleft()
            if k<=t[i][j]:
                for x,y in (i+1,j),(i-1,j),(i,j-1),(i,j+1):
                    if 0<=x<len(heights) and 0<=y<len(heights[0]):
                        z=max(k,abs(heights[x][y]-heights[i][j]))
                        if z<t[x][y]:
                            t[x][y]=z
                            que.append([x,y,z])
        return t[-1][-1]


class Solution:
    def minimumEffortPath(self, heights: List[List[int]]) -> int:
        m=len(heights)
        n=len(heights[0])
        l=0
        r=10**6
        def dfs(i,j):
            if i==m-1 and j==n-1:
                return True
            for x,y in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]:
                if 0<=x<m and 0<=y<n and (x,y) not in visited and abs(heights[x][y]-heights[i][j])<=mid:
                    visited.add((x,y))
                    if dfs(x,y):return True
            return False 

        
        while l<r:
            mid=(l+r)//2
            visited=set([(0,0)])
            if dfs(0,0):
                r=mid
            else:
                l=mid+1
        return l

 

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页