1.题目描述
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
1.如果题目有解,该答案即为唯一答案。
2.输入数组均为非空数组,且长度相同。
3.输入数组中的元素均为非负数。
示例 1:
示例 2:
2.思路
如果总油量减去总消耗大于零那么一定可以跑完一圈,说明各个站点的加油站剩余油量remain[i]相加一定是大于零的。每个加油站的剩余量remain[i]为gas[i] - cost[i]。
i从0开始累加remain[i],和记为curSum,如果curSum小于零,说明 [0, i]区间都不能作为起始位置,起始位置从i+1算起。
3.代码
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total_sum = 0;
int cur_sum = 0;
int start = 0;
for(int i = 0;i < gas.size();++i){
total_sum += gas[i] - cost[i];
cur_sum += gas[i] - cost[i];
if(cur_sum < 0){
cur_sum = 0;
start = i + 1;
}
}
return total_sum >= 0 ? start : -1;
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)