问题描述:
有N个油气站构成环形路径,第i个油气站有gas[i]个单位的油,一辆容量无限的油罐车从第i个油气站到第i+1个油气站需要消耗cost[i]个单位油. 如果这辆车能够从任意一站出发依靠油气站补给能够回到原来的地方.求这个起点, 如果不存在输出-1.
.
图片网址
分析:
假设从站start出发,到第n个油气站,记
sum=∑ni=startgas[i]−cost[i]
, 当第一次sum < 0 的时候,这意味着以start到i所有站为起点都不会通过第i个站,因为这只会让到达此处的和更小
这意味着可以一下排除 i - start +1 个节点不可行, 那么更新 start = i + 1, 继续从新的start排除节点
如果从start 出发能够回到start, 那么这个站就是要求的了.
如果排除所有站,说明不存在这样的站点.
这个思路过程类比序列连续最大和问题
代码:
/* 循环里面i 与 j 同步, i负责探测路径, j负责检测是否已经排除所有节点 */
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int sum = 0 ;
int start = 0;
int j =0 ;
for(int i =0 ;start < gas.size() ; i =(i+1)%gas.size(), ++j)
{
sum += gas[i] - cost[i];
if(ss < 0)
{
sum= 0 ;
start = j+1;
}else
if((i+1)%gas.size()== start)return start;
}
return -1;
}
};