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

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


贪心算法在LeetCode:加油站问题中的应用

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。在LeetCode中,有一个经典的贪心算法问题——加油站(Gas Station)。本文将围绕这个问题,探讨贪心算法在解决环路上的加油站问题中的应用。

问题背景

假设你是一个旅行者,现在你有一辆油箱容量有限的汽车,你需要在一系列加油站加油,以完成你的旅行。每个加油站都有一个油量和一个价格,你只能选择一个加油站加油,并且每次加油后,你都需要支付相应的费用。你的目标是找到一种加油方案,使得你能够以最少的费用完成整个旅行。

问题分析

这个问题可以转化为一个贪心算法问题。贪心算法的核心思想是在每一步都做出当前看起来最优的选择,并希望这个选择能够导致最终结果的最优。

解题思路

1. 计算总油量与总费用:计算所有加油站的总油量和总费用。

2. 判断可行性:如果总油量小于总费用,则说明无法完成旅行,返回空列表。

3. 贪心选择加油站:从第一个加油站开始,每次选择当前剩余油量加上当前加油站油量大于等于下一个加油站距离的下一个加油站。

4. 更新剩余油量:每次加油后,更新剩余油量。

5. 记录加油站位置:记录每次加油的加油站位置。

6. 返回结果:返回记录的加油站位置列表。

代码实现

以下是一个使用Python实现的贪心算法解决加油站问题的示例代码:

python

def canCompleteCircuit(gas, cost):


total_tank, curr_tank = 0, 0


position = 0


for i in range(len(gas)):


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


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


if curr_tank < 0:


curr_tank = 0


position = i + 1


if total_tank < 0:


return []


return list(range(position, position + len(gas)))

示例


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


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


print(canCompleteCircuit(gas, cost)) 输出: [3, 4]


性能分析

- 时间复杂度:O(n),其中n为加油站的数量。因为我们需要遍历所有加油站一次。

- 空间复杂度:O(1),我们只需要常数级别的额外空间来存储总油量、当前油量、位置和结果列表。

总结

本文通过分析LeetCode中的加油站问题,介绍了贪心算法在解决环路上的加油站问题中的应用。通过贪心策略,我们可以在每一步都做出当前看起来最优的选择,从而找到一种最少的费用完成整个旅行的方案。在实际应用中,贪心算法是一种简单而有效的算法策略,可以帮助我们解决许多优化问题。