1631. 最小体力消耗路径
最后更新于
这有帮助吗?
这有帮助吗?
输入:heights = [[1,2,2],[3,8,2],[5,3,5]]
输出:2
解释:路径 [1,3,5,3,5] 连续格子的差值绝对值最大为 2 。
这条路径比路径 [1,2,2,2,5] 更优,因为另一条路劲差值最大值为 3 。
示例 2:
输入:heights = [[1,2,3],[3,8,4],[5,3,5]]
输出:1
解释:路径 [1,2,3,4,5] 的相邻格子差值绝对值最大为 1 ,比路径 [1,3,5,3,5] 更优。
示例 3:
输入:heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
输出:0
解释:上图所示路径不需要消耗任何体力。
提示:
rows == heights.length
columns == heights[i].length
1 <= rows, columns <= 100
1 <= heights[i][j] <= 10e6
return dfs(i + 1, j, heights[i][j], target) or dfs(i - 1, j, heights[i][j], target) or dfs(i, j + 1, heights[i][j], target) or dfs(i, j - 1, heights[i][j], target)top = dfs(i + 1, j, heights[i][j], target)
bottom = dfs(i - 1, j, heights[i][j], target)
right = dfs(i, j + 1, heights[i][j], target)
left = dfs(i, j - 1, heights[i][j], target)
return top or bottom or right or left
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
lo, hi = 0, 10**6 - 1
m, n = len(heights), len(heights[0])
def dfs(i, j, pre, target):
if (i, j) in visited: return False
if i < 0 or i >= m or j < 0 or j >= n or abs(heights[i][j] - pre) > target: return False
if i == m - 1 and j == n - 1: return True
visited.add((i, j))
return dfs(i + 1, j, heights[i][j], target) or dfs(i - 1, j, heights[i][j], target) or dfs(i, j + 1, heights[i][j], target) or dfs(i, j - 1, heights[i][j], target)
# 查找最右侧满足条件的值
while lo <= hi:
visited = set()
mid = (lo + hi) >> 1
if dfs(0, 0, heights[0][0], mid): hi = mid - 1
else: lo = mid + 1
return lo