解析:
a1 a2 a3 a4 a5 a6
如果a1到a3总的加气-用气<0,那么a1,a2都不能用作起点,a3作为起点
//复杂度O(n)
class
Solution {
public
:
int
canCompleteCircuit(vector<
int
> &gas, vector<
int
> &cost) {
//total记录全局是否有解,sum记录i到i+1是否可行
int
total = 0, sum = 0;
int
index = -1;
for
(
int
i = 0; i < gas.size(); i++) {
sum += gas[i] - cost[i];
//本次消耗
total += gas[i] - cost[i];
//总消耗
if
(sum < 0) {
sum = 0;
index = i;
//记录解的位置
}
}
return
total >= 0 ? index + 1 : -1;
//只要total>=0,肯定有解
}
};
有一个没看到答案,记录下
从start出发, 如果油量足够, 可以一直向后走 end++; 油量不够的时候,
start向后退 最终 start == end的时候,如果有解一定是当前 start所在位置
class
Solution {
public
:
int
canCompleteCircuit(vector<
int
> &gas, vector<
int
> &cost) {
int
start = gas.size() - 1;
int
end = 0;
int
sum = gas[start] - cost[start];
while
(start > end){
if
(sum >= 0){
sum += gas[end] - cost[end];
++end;
}
else
{
--start;
sum += gas[start] - cost[start];
}
}
return
sum >=0 ? start : -1;
}
};
|