数据结构与算法之 leetcode 贪心算法加油站算法 环路上的起点

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


贪心算法在LeetCode:加油站算法(环路上的起点)

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。在LeetCode中,有一个经典的题目叫做“加油站算法(环路上的起点)”,该题目旨在通过贪心算法找到在环路上能够使得油箱油量最多的一段路径,使得汽车能够完成整个环路的行驶。

题目描述

假设有一个环形的停车场,停车场中有若干个加油站,每个加油站都有一个油量。汽车从某个加油站出发,需要按照一定的顺序经过所有加油站,并且在每个加油站加油,才能完成整个环路的行驶。现在给定一个数组,其中包含每个加油站的油量和距离,要求找到起始加油站的位置,使得汽车能够完成整个环路的行驶。

解题思路

为了解决这个问题,我们可以采用以下步骤:

1. 计算每个加油站的净油量:净油量是指加油站提供的油量减去到达该加油站所需的油量。

2. 找到最大净油量的加油站:遍历所有加油站,找到净油量最大的加油站。

3. 检查最大净油量加油站是否能够完成整个环路:从最大净油量加油站出发,计算能否到达下一个加油站,并继续这个过程,直到回到起点。

4. 如果可以完成环路,返回起始加油站的位置;否则,返回-1表示无法完成环路。

代码实现

下面是使用Python实现的代码:

python

def can_complete_circuit(gas, cost):


n = len(gas)


if sum(gas) < sum(cost):


return -1

start, cur_gas = 0, 0


for i in range(n):


cur_gas += gas[i] - cost[i]


if cur_gas < 0:


start = i + 1


cur_gas = 0

return start if start < n else -1

示例


gas = [1, 2, 3, 4, 5]


cost = [3, 4, 5, 1, 2]


print(can_complete_circuit(gas, cost)) 输出应为 3


代码解析

1. 计算净油量:我们首先计算了每个加油站的净油量,即`gas[i] - cost[i]`。

2. 遍历加油站:我们使用一个循环来遍历所有的加油站,并计算当前加油站到下一个加油站的净油量。

3. 检查是否足够到达下一个加油站:如果当前加油站到下一个加油站的净油量为负数,说明从当前加油站出发无法到达下一个加油站,因此我们需要重新开始计算,并将起始加油站设置为下一个加油站。

4. 返回结果:如果能够完成整个环路,则返回起始加油站的位置;否则,返回-1。

总结

通过上述分析和代码实现,我们可以看到贪心算法在解决“加油站算法(环路上的起点)”问题时是非常有效的。贪心算法通过在每个步骤都做出当前最优的选择,最终得到了全局最优解。在实际应用中,贪心算法虽然不能保证在所有情况下都能得到最优解,但它在很多情况下都能提供一种简单且高效的解决方案。