题目
解析
这个题目再Leetcode 的problems里面还没有,只出现在Weekly contest 212的第3题
一开始觉得这个题目是个DP,觉得两遍dp可以做,实际上思路错了,两个方向的dp是不行的。
基本上看到四个方向可走的题目就是用最短路径问题来做,最短路径这边也提供两种做法,一种是Bellman ford,另一种是Dijkstra,关于两种做法的详细解释看这题 Leetcode The Maze I,II
Bellman ford 版本
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
m = len(heights)
n = len(heights[0])
q = collections.deque()
q.append((0,0))
distances = [[float('inf')]*n for _ in range(m)]
distances[0][0] = 0
dirs = [[0,1],[1,0],[0,-1],[-1,0]]
while q:
i,j = q.popleft()
for d in dirs:
x = i+d[0]
y = j+d[1]
if 0<=x<m and 0<=y<n and distances[x][y]>max(distances[i][j],abs(heights[x][y]-heights[i][j])):
q.append((x,y))
distances[x][y] = max(distances[i][j],abs(heights[x][y]-heights[i][j]))
return distances[-1][-1] if distances[-1][-1]!=float('inf') else -1
利用heap的Dijkstra
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
m = len(heights)
n = len(heights[0])
distances = [[float('inf')]*n for _ in range(m)]
distances[0][0] = 0
dirs = [[0,1],[1,0],[0,