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;否则,调整范围继续搜索。

  • 通过这种方法,我们可以高效地找到从起点到终点的最小体力消耗路径。

    上一篇:410 分割数组的最大值(二分查找、动态规划)
    下一篇:1630 等差子数组(暴力破解)

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月02日 06时06分43秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章