作者:MJ昊
公众号:程序猿的编程之路
今天是 昊 的算法之路第5天,今天分享的是LeetCode第134题加油站的解题思路。这道题目虽然难度为中等
,但通过优化的贪心算法可以高效解决问题。
题目描述简要回顾
你需要从一个加油站出发,按顺序经过所有加油站并返回起点。如果有足够的汽油完成这趟旅程,返回起始加油站的编号;否则,返回-1
。
解题思路
这道题可以通过贪心算法来解决,关键在于找到一个合适的出发点,让从这个点出发能够完成整圈的环路行驶。我们需要通过两个基本原则来理解:
- 局部判断: 每次如果到达某个加油站时发现汽油不足以开到下一个站,那么从当前加油站或之前的加油站出发都是行不通的。因此可以直接跳过这段区间。
- 全局判断: 如果从某个加油站起始能走完整圈,那么在这个站之前的所有加油站都不能作为起始站。
代码实现:
var canCompleteCircuit = function(gas, cost) { const n = gas.length; let i = 0; while (i < n) { let sumOfGas = 0, sumOfCost = 0; let cnt = 0; while (cnt < n) { const j = (i + cnt) % n;// 模拟环路 sumOfGas += gas[j];// 当前获得的汽油 sumOfCost += cost[j];// 当前消耗的汽油 if (sumOfCost > sumOfGas) { break;// 无法继续前进,跳出循环 } cnt++; } if (cnt === n) { return i; // 找到了合适的起始点 } else { i = i + cnt + 1; // 跳过无法行驶的区间 } } return -1; // 无法找到合适的起点 };
复杂度分析
- 时间复杂度:O(n),每个加油站最多被访问两次,一次是作为可能的起点,一次是跳过无法继续的区间。
- 空间复杂度:O(1),只使用了常数的额外空间。
总结
通过贪心策略,我们可以在O(n)时间内高效解决这个问题。