
1631 最小体力消耗路径(dfs + 二分查找优化)
发布日期:2021-05-07 21:55:19
浏览次数:40
分类:精选文章
本文共 1887 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到一条从二维地图的左上角到右下角的路径,使得路径上相邻格子之间的高度差绝对值的最大值最小。我们可以使用二分查找和深度优先搜索(DFS)来高效地解决这个问题。
方法思路
问题分析:我们的目标是找到一条路径,使得路径上的最大高度差最小。这类似于在矩阵中寻找路径的问题,可以通过DFS来搜索所有可能的路径,但直接使用DFS可能会超时,因此我们需要优化。
二分查找:由于路径的体力消耗值在0到最大高度差之间,我们可以使用二分查找来确定最小的体力消耗值。我们将范围设定为0到最大高度差,然后逐步调整范围,直到找到最小的可行值。
DFS搜索:对于每个中间值d,我们使用DFS来检查是否存在一条从起点到终点的路径,使得路径上的每一步的高度差都不超过d。如果找到这样的路径,我们可以继续寻找更小的d;否则,我们需要增大d。
解决代码
from typing import Listclass Solution: def minimumEffortPath(self, heights: List[List[int]]) -> int: rows = len(heights) if rows == 0: return 0 cols = len(heights[0]) directions = [[0, 1], [0, -1], [1, 0], [-1, 0]] max_height = max(max(row) for row in heights) left = 0 right = max_height answer = max_height def dfs(x, y, d, visited): if x == rows - 1 and y == cols - 1: return True if visited[x][y]: return False visited[x][y] = True for dx, dy in directions: nx = x + dx ny = y + dy if 0 <= nx < rows and 0 <= ny < cols: if not visited[nx][ny] and abs(heights[x][y] - heights[nx][ny]) <= d: if dfs(nx, ny, d, visited): return True visited[x][y] = False return False while left <= right: mid = (left + right) // 2 visited = [[False for _ in range(cols)] for _ in range(rows)] if dfs(0, 0, mid, visited): answer = mid right = mid - 1 else: left = mid + 1 return answer
代码解释
初始化:我们初始化二分查找的范围为0到最大高度差,并设置起点和终点。方向数组用于表示四个移动方向。
DFS函数:这个函数用于检查是否存在一条从当前位置到终点的路径,且路径上的每一步的高度差不超过d。它使用一个访问矩阵来跟踪已访问的格子,避免重复访问。
二分查找:在每次二分中,计算中间值mid,并调用DFS函数检查是否存在满足条件的路径。如果存在,更新答案并尝试寻找更小的d;否则,调整范围继续搜索。
通过这种方法,我们可以高效地找到从起点到终点的最小体力消耗路径。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月02日 06时06分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
async/await剖析
2019-03-06
cmp命令
2019-03-06
一次编辑
2019-03-06
简单工厂模式
2019-03-06
代理模式
2019-03-06
Js中Currying的应用
2019-03-06
长按键入
2019-03-06
Vuex和普通全局对象
2019-03-06
上升下降字符串
2019-03-06
JavaScript中的链式调用
2019-03-06
day-04-列表
2019-03-06
day-13-匿名函数-内置函数2-闭包
2019-03-06
Linux 磁盘管理(df fu fdisk mkfs mount)
2019-03-06
力扣125. 验证回文串-C语言实现-简单题
2019-03-06
空间向量
2019-03-06
第一类曲面积分
2019-03-06
常数项级数
2019-03-06
Mybatis的介绍和基本使用
2019-03-06
Redis简介(数据结构,哨兵、集群和SpringDataRedis)
2019-03-06
jar包破解Idea
2019-03-06