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

发布时间:2026/6/15 18:27:56
贪心法求经典算法题——最低加油次数
思路和算法用 n 表示数组 stations 的长度即加油站的个数。行驶的过程中依次到达 n1 个位置分别是 n 个加油站和目的地。为了得到最少加油次数应该在确保每个位置都能到达的前提下选择最大加油量的加油站加油。为了得到已经到达过的加油站中的最大加油量需要使用优先队列记录所有已经到达过的加油站的加油量优先队列中的最大元素位于队首即每次从优先队列中取出的元素都是优先队列中的最大元素。从左到右遍历数组 stations 对于每个加油站首先判断该位置是否可以达到然后将当前加油站的加油量添加到优先队列中。对于目的地则只需要判断是否可以达到。具体做法如下1.计算当前位置加油站或目的地与上一个位置的距离之差根据该距离之差得到从上一个位置行驶到当前位置需要使用的汽油量将使用的汽油量从剩余的汽油量中减去。2.如果剩余的汽油量小于 0 则表示在不加油的情况下无法从上一个位置行驶到当前位置需要加油。取出优先队列中的最大元素加到剩余的汽油量并将加油次数加 1重复该操作直到剩余的汽油量大于等于 0 或优先队列变为空。3.如果优先队列变为空时剩余的汽油量仍小于 0 则表示在所有经过的加油站加油之后仍然无法到达当前位置返回 −1 。4.如果当前位置是加油站则将当前加油站的加油量添加到优先队列中并使用当前位置更新上一个位置。如果无法到达目的地则在遍历过程中返回 −1 。如果遍历结束仍未返回 −1 则可以到达目的地返回加油次数。代码Python3class 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