题目链接: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; } };