贪心法求经典算法题——最低加油次数

思路和算法

用 n 表示数组 stations 的长度,即加油站的个数。行驶的过程中依次到达 n+1 个位置,分别是 n 个加油站和目的地。为了得到最少加油次数,应该在确保每个位置都能到达的前提下,选择最大加油量的加油站加油。

为了得到已经到达过的加油站中的最大加油量,需要使用优先队列记录所有已经到达过的加油站的加油量,优先队列中的最大元素位于队首,即每次从优先队列中取出的元素都是优先队列中的最大元素。

从左到右遍历数组 stations ,对于每个加油站,首先判断该位置是否可以达到,然后将当前加油站的加油量添加到优先队列中。对于目的地,则只需要判断是否可以达到。

具体做法如下:

1.计算当前位置(加油站或目的地)与上一个位置的距离之差,根据该距离之差得到从上一个位置行驶到当前位置需要使用的汽油量,将使用的汽油量从剩余的汽油量中减去。

2.如果剩余的汽油量小于 0 ,则表示在不加油的情况下无法从上一个位置行驶到当前位置,需要加油。取出优先队列中的最大元素加到剩余的汽油量,并将加油次数加 1,重复该操作直到剩余的汽油量大于等于 0 或优先队列变为空。

3.如果优先队列变为空时,剩余的汽油量仍小于 0 ,则表示在所有经过的加油站加油之后仍然无法到达当前位置,返回 −1 。

4.如果当前位置是加油站,则将当前加油站的加油量添加到优先队列中,并使用当前位置更新上一个位置。

如果无法到达目的地,则在遍历过程中返回 −1 。如果遍历结束仍未返回 −1 ,则可以到达目的地,返回加油次数。

代码

Python3

复制代码
class Solution:
    def minRefuelStops(self, target: int, startFuel: int, stations: List[List[int]]) -> int:
        n = len(stations)
        ans, fuel, prev, h = 0, startFuel, 0, []
        for i in range(n + 1):
            curr = stations[i][0] if i < n else target
            fuel -= curr - prev
            while fuel < 0 and h:
                fuel -= heappop(h)
                ans += 1
            if fuel < 0:
                return -1
            if i < n:
                heappush(h, -stations[i][1])
                prev = curr
        return ans
相关推荐
用户979984807182 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks2 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea3 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术3 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术3 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924493 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠3 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术3 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考3 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考3 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习