20.11.18 leetcode134

题目链接:https://leetcode-cn.com/problems/gas-station/

题意:有n个加油站环形排列,每个加油站都可以获得数量为gas[i]的石油,但从该加油站出发抵达下一加油站需要消耗cost[i]的石油,问能否从一个加油站出发再回到该加油站,如果可以,输出序号最小的加油站编号,不可以,则输出-1.

分析:我只想到了遍历这个想法,就去看了题解,题解也是遍历,但是它有一个优化,就是它证明了从加油站i出发如果最远能到达加油站j的话,那么从[i+1,j-1]这些加油站也都无法超过加油站j,在给出题解的证明思路前我先说一下直观感受。那就是从加油站i出发既然能够到达j,那么它肯定也可以到达[i+1,j-1](废话),换句话说,在到达[i+1,j-1]时,此时的油量肯定是大于等于0的,而直接从[i+1,j-1]出发,它们此时的油量都为0,故肯定不如从加油站i出发。

接下来是题解的数学证明,我就直接放截图了。

 

 有了这个数学结论,我们在遍历时如果一个点不能跑完全程,那么下一次遍历直接从它不能到达的第一个点开始就可以了。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int ans=0;
        int n=gas.size();
        while(ans<n){
            int cnt=0;
            int sumg=0,sumc=0;
            while(cnt<n){
                int j=(ans+cnt)%n;
                sumg+=gas[j];
                sumc+=cost[j];
                if(sumc>sumg)break;
                cnt++;
            }
            if(cnt==n)return ans;
            else ans=ans+cnt+1;
        }
        return -1;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14002749.html