1.一次遍历即可
首先有一条是确定的,如果总的汽油量大于等于消耗量,一定可以走完全程。
从0出发,假设可以一直走到K站,到K+1站时汽油不足,即无法到达K+1,此外我们将油箱中的油量清空,重新从K+1出发。然后重新计算油箱油量,当无法到达下一加油站时,再次重新设置起点,这里可以以K+1为分界线,将所有的加油站分为两类:
0--K:从0出发可以到达K,无法到达K+1,K+1--end,从K+1重新出发,可以到达end,且可以以剩余油量继续从0出发,到达K,即绕一圈。
代码如下:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int rest = 0, run = 0, start = 0;
for (int i = 0; i < gas.size(); ++i){
run += (gas[i] - cost[i]);
rest += (gas[i] - cost[i]);
if (run < 0){
start = i + 1;
run = 0;
}
}
return rest < 0 ? -1: start;
}
};