在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
题解
法一 贪心法
● 如果选择站点i作为起点「恰好」无法走到站点j,那么i和j中间的任意站点k都不可能作为起点。
● 为什么会有上面这个结论呢?我们举个具体的例子来看,假设left += gas[i]-cost[i]
● 从起点站 a 出发,必须 gas[a] - cost[a] >= 0 才能到 b 站。假设去到 c 站加完油发现去不了 d 站,只是说明 a 站不是合格起点吗?
● 到不了 d 站就说明: (gas[a] - cost[a] )+ (gas[b] - cost[b])+ (gas[c] - cost[c])<0,也就是说left(a)+left(b)+left©<0,而已经left(a)>=0,所以left(b)+left©<0,b 站不能作为起点,因为去不了 d
● 如果能来到c站,肯定到过 b 站,所以有: left(a)+left(b)>=0,又因为:left(a)+left(b)+left©<0,所以有:left©<0
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int remain = 0;
int len=gas.length;
int start=0;
int total=0;
for(int i=0;i<len;i++){
total+=gas[i]-cost[i];
remain+=gas[i]-cost[i];
if(remain<0){
remain=0;
start=i+1;
}
}
if(total<0) return -1;
return start;
}
}