题目链接
思路:一次遍历
分析:那么就从每个站点出发试试
但是,开始的站点,肯定要满足能加的油肯定要大于等于去下一站要耗费的油量。
即gas[i]>=cost[i]
并且因为答案唯一,所以能加的油量肯定不是0
即gas[i]!=0
假设从x点出发,最远到了y,假设没有经过所有站点。
那么下一次开始的点,不是x后的站点,而应该是y后面的站点。
因为x和y中间的站点,已经走过了,已经判断了不行。
代码:
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len = gas.length;
int max =0;
int start =0;
for(int i=0;i<len;i++){
//起点肯定是 能加的油多余花费的汽油 并且因为答案唯一,所以起点肯定不是加油0
if(gas[i]>=cost[i] && gas[i]!=0){
//start记录起点
start = i;
//记录此时的油量,一开始肯定是0
int t =0;
//记录经过的站点
int count=0;
//判断跑到下一站的油够不够 并且 判断是不是跑过所有站点了
while(t+gas[start%len]-cost[start%len]>=0 && count<=len){
t = t+gas[start%len]-cost[start%len];
start++;
count++;
}
//如果跑过了所有站点,那么就找到答案了
if(count>=len){
return i;
}else{
//否则就从下一个到不了的油站开始,因为从前面的油站出发,已经试过了,不能经过所有站点,这个要仔细想想
i = i+count;
}
}
}
return -1;
}
}