1631.最小体力消耗路径
https://leetcode-cn.com/problems/path-with-minimum-effort/
Dijkstra 变种
一开始以为是dp,但问题是这种求相邻结点高度差最大值的状态不能累加,即没有递推方程。
最后还是用bfs+贪心
class Solution:
def minimumEffortPath(self, heights) -> int:
m = len(heights)
n = len(heights[0])
dirs = [0, 1, 0, -1, 0]
# 返回(x, y)的邻节点
def adj(x, y):
neighbors = []
for i in range(4): #上下左右四个方向
nx = x + dirs[i]
ny = y + dirs[i+1]
if nx < 0 or nx >= m or ny < 0 or ny >= n:
continue
neighbors.append((nx, ny))
return neighbors
# effortTo[i][j] 表示 (0,0)-->(i,j)的最小消耗
effortTo = [[sys.maxsize] * n for _ in range(m)]
effortTo[0][0] = 0
#最小堆,存储tuple(到某点体力值,某点坐标x、y)
pq = []
heapq.heappush(pq, (0,0,0))
while pq:
curEffortFromStart, curX, curY = heapq.heappop(pq)
if curX == m-1 and curY == n-1:
return curEffortFromStart
if curEffortFromStart > effortTo[curX][curY]:
continue
for neigh in adj(curX, curY):
nextX = neigh[0]
nextY = neigh[1]
#比较【高度差】 与 【记录表】,取较大值作为到下一个节点体力值
effortToNext = max(
abs(heights[curX][curY] - heights[nextX][nextY]),
curEffortFromStart
)
#找到更小的,更新记录表并加入堆
if effortToNext < effortTo[nextX][nextY]:
effortTo[nextX][nextY] = effortToNext
heapq.heappush(pq, (effortToNext, nextX, nextY))
# 无法到达终点
return -1
最后更新于