本人电子系,只为一学生。心喜计算机,小编以怡情。
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第i个加油站前往第i+1个加油站需要消耗汽油cost[i]。
你有一辆油箱容量无限大的汽车,现在要从某一个加油站出发绕环路一周,一开始油箱为空。
求可环绕环路一周时出发的加油站的编号,若不存在环绕一周的方案,则返回-1。
注意事项
数据保证答案唯一。
样例
现在有4个加油站,汽油量gas[i]=[1, 1, 3, 1],环路旅行时消耗的汽油量cost[i]=[2, 2, 1, 1]。则出发的加油站的编号为2。
思考:起初我打算用循环链表来做这道题,可是这样就太麻烦了。于是我想到了用取模的方法,变相的实现了循环的功能。
其次,这里有个数学技巧
1, 1, 3, 1
2, 2, 1, 1假设从下标2开始,即起初有3单位汽油能够循环一周
即 3-1+1-2+1-2+1-1>0
也就是说最多加减七次,我们可以int count=2*gas.length-1;
如果七次后累和的中间过程即最终结果都>=0,就是我们想要的
否则,就换下个一个起始点
public int canCompleteCircuit(int[] gas, int[] cost) {
// write your code here
for(int i=0;i<gas.length;i++)//每个起始点,这里以下标2为例
{
int count=2*gas.length-1;//计数,例子是7次
int start=gas[i];//刚开始有3单位汽油
int sum=start;//累和也是刚开始3单位
int j=i;//j用来下面循环-1+1-2+1-2+1-1的过程
while(count--!=0)
{
sum=sum-cost[j%cost.length];
if(sum<0)//中间过程如果有<0,则证明这个点不能循环一周,退出while
break;
sum+=gas[(j+1)%cost.length];//否则继续
j++;//j指向下一个点
}
if(sum<0) //这里对应while里的break,即这个点不合适,换下一个点
continue;
if(sum>=0) //表示当前点历经七次还能大于零,就是我们想要的
return i;
}
return -1;//四个点都循环一边没找到,只能return -1了
}