题目
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gas-station
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n=gas.length;
int sum=0;
for (int i = 0; i <n ; i++) {
sum+=gas[i]-cost[i];//进入一个加油站加的实际的油等于油量-cost
}
if (sum<0) return -1;// 总油量小于总的消耗,无解
// 记录油箱油量
int tank=0;
int ans=0;
for (int i = 0; i <n ; i++) {
tank+=gas[i]-cost[i];
if (tank<0){// 无法从 start 走到 i
ans=i+1;// 所以站点 i + 1 应该是起点
tank=0;
}
}
return ans==n?0:ans;//也可能走不到
}
}
要点
- 本题使用贪心算法,如果选择站点 i 作为起点「恰好」无法走到站点 j,那么 i 和 j 中间的任意站点 k 都不可能作为起点。
- 所以贪心策略是,遍历数组,同时维护当前油箱的油量,若油箱小于零,说明当前的起点不能走完,可能起点是下一个加油站。
- 需要注意,就算总油量>总消耗量,也可能无法走完,需要在最后进行判断