感觉这道题目,在中等题里面算挺难的
分析:
gas = [1,2,3,4,5], cost = [3,4,5,1,2]
其实就是保证过程中累加sum=gas-cost,恒大于0
如果最后sum>=0,说明走的通
然后判断起点,有两种方法
1.
设置cursum,当cursum<0的时候,将i+1作为新的起点,然后cursum=0
理解,每次cursum<0的时候,说明前面的路其实不适合走,/不适合做起点,因为到i这里已经输了
只能从后面另寻起点(胜利)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int sum=0;
int cursum=0;
int start=0;
for(int i=0;i<gas.size();i++){
sum+=gas[i]-cost[i];
cursum+=gas[i]-cost[i];
if(cursum<0){
start=i+1;
cursum=0;
}
}
if(sum<0)return -1;
else return start;
}
};
2.
设置minn,寻找什么时候sum最小的时候,更新minn=sum,minn_index=i,然后返回minn_index+1
理解:类似第一问,都是在寻找全盘皆输的时候,但是这个是寻找输的最彻底的,然后输的最彻底的下一个位置作为重新出发点!!!(简单吧?)哈哈哈
然后,为什么minn_sum最小的是就是输的最彻底呢?因为一直在比较,只要后面没小于前面的,前面的一定是最小的时候
需要注意,当minn>=0说明,这局没有输的地方(也就是第一步就赢了)
int sum=0;
int minn_index=0;
int minn=999999;
for(int i=0;i<gas.size();i++){
sum+=gas[i]-cost[i];
if(sum<minn){
minn_index=i;
minn=sum;
}
}
if(sum<0)cout<<-1;
else if(minn>=0)return 0;
else cout<<(minn_index+1)%gas.size();