打卡记录
最小体力消耗路径
链接
Dijkstra
将Dijkstra算法从计算最短路径转化为计算路径最大差值。
class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n, m = len(heights), len(heights[0])dist = [0] + [0x3f3f3f3f] * (n * m - 1)vis = set()q = [(0, 0, 0)]while q:d, x, y = heappop(q)idx = x * m + yif idx in vis:continuevis.add(idx)for nx, ny in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:if 0 <= nx < n and 0 <= ny < m:max_diff = max(d, abs(heights[x][y] - heights[nx][ny]))if max_diff < dist[nx * m + ny]:dist[nx * m + ny] = max_diffheappush(q, (max_diff, nx, ny))return dist[-1]
二分 + BFS
class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n, m = len(heights), len(heights[0])def check(t):vis = set()q = collections.deque()q.append((0, 0))vis.add(0)while q:x, y = q.popleft()for nx, ny in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:if 0 <= nx < n and 0 <= ny < m and nx * m + ny not in vis:max_diff = abs(heights[x][y] - heights[nx][ny])if max_diff <= t:q.append((nx, ny))vis.add(nx * m + ny)return m * n - 1 in visl, r = 0, 10 ** 6 + 1while l < r:mid = (l + r) // 2if check(mid):r = midelse:l = mid + 1return l