class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
// for(int i = 0;i<gas.length;i++){
// int gasTank = 0;
// int j=i;
// for(j = i;j <= i+gas.length-1 && gasTank >= 0;j++){
// int temp = j%gas.length;
// gasTank += gas[temp]-cost[temp];
// }
// if(gasTank >= 0 && j%gas.length == i)
// return i;
// else
// i=j-1;
// }
// return -1;
int total=0;
int last = 0;
int start = 0;
for(int i = 0;i<gas.length;i++){
total += gas[i]-cost[i];
last += gas[i]-cost[i];
if(last < 0){
last = 0;
start = i+1;
}
}
if(total >= 0) return start;
else return -1;
}
//欲证明:total>=0 => 必存在可走通的起点
//可证明其逆否命题: 不存在可走通的起点 => total<0
//不存在可走通的起点 => 显然有:从任意起点i出发,都会找到这样一个j,使得从i出发的路径会在j处终止(并且从i到j-1的每一步都是可走的,i,j可重复),不
//难推出有如下式子:gas[i]-cost[i]>=0,
// gas[i]-cost[i]+gas[i+1]-cost[i+1]>=0,
// gas[i]-cost[i]+gas[i+1]-cost[i+1]+...+gas[j-1]-cost[j-1]>=0,
// gas[i]-cost[i]+gas[i+1]-cost[i+1]+...+gas[j]-cost[j]<0 (这段路程为负)
// 当然也能推出cost[j]-cost[j]<cost[i]-gas[i]+gas[i+1]-cost[i+1]<=0(这段路程的最后一点的gas-cost为负,且一定比之前剩余的油量的绝对
// 值要大)
//也就是说无论从哪一点i出发,总会在某一个cost[j]-cost[j]<0的位置终结。那么只要从i(1)出发,会在j(1)终止,再从i(2)=j(1)+1出发,一定会在j(2)终
//止....从i(n+1)=j(n)出发,一定会在j(n+1)终止。(备注:(n)表示下标)
//接下来会出现一个有意思的现象,数组一共才只有n个点,说明j(1)~j(n+1)中必有两点重复,不妨假设重复点是j(k)=j(l),k>l.我们走如下路径:
// i(k+1)=j(k)+1->j(k+1),i(k+2)=j(k+1)+1->j(k+2),...,i(l)=j(l-1)+1->j(l)=j(k),这一定是恰好走完了m圈(虽然我们不知道m的具体数值),而且每一段的路径都<0,那么可知这段路程的总长度m*total<0
//total<0得证
//逆否命题得证
//原命题得证
//P.E.D.
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交