问题描述
环形路上有n个加油站,第i个加油站的汽油量是gas[i].
你有一辆车,车的油箱可以无限装汽油。从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时候油箱里面没有汽油。
求从哪个加油站出发可以在环形路上走一圈。返回加油站的下标,如果没有答案的话返回-1。
注意:
答案保证唯一。
解法
贪心算法
主要使gas和cost插的序列的累计和始终不为负
从起点出发,若sum为负。start退后一个,试图使sum为正
如果sum为正,end继续往前走
class Solution {
public:
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int len = gas.size();
if(len ==0)return -1;
vector<int> diff;
for(int i=0;i<len;i++)diff.push_back(gas[i]-cost[i]);
if(len==1 && diff[0]<0) return -1;
int start = len-1,end =0,sum=diff[start];
while(start!=end){
if(sum>=0)sum+=diff[end++];
else sum+=diff[--start];
}
if(sum>=0)return start;
else return -1;
}
};