leetcode134. Gas Station完全解析

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.
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值