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

思路和算法

用 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
相关推荐
^yi36 分钟前
【Linux系统编程】进程状态的理解
算法·僵尸进程·孤儿进程·进程状态·挂起状态·阻塞状态
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
长不胖的路人甲2 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法
geovindu2 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法
长不胖的路人甲2 小时前
可达性分析法(根搜索算法)完整详解
java·jvm·算法
paeamecium2 小时前
【PAT甲级真题】- Kuchiguse (20)
数据结构·c++·python·算法·pat考试·pat
青山木2 小时前
Hot 100 --- 全排列
java·数据结构·算法·leetcode·深度优先
海兰2 小时前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
KaMeidebaby2 小时前
卡梅德生物技术快报|核酸适配体文库筛选:核酸适配体文库筛选全流程技术解析:NGS与AI辅助方案的设计与实践
前端·人工智能·物联网·算法·百度
数聚天成DeepSData2 小时前
CWRU轴承数据集官方入口与替代获取渠道(2025核实版)
算法