134. 加油站
程序员文章站
2024-03-09 14:10:35
...
1.题目描述
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
1.如果题目有解,该答案即为唯一答案。
2.输入数组均为非空数组,且长度相同。
3.输入数组中的元素均为非负数。
示例 1:
示例 2:
2.思路
total_tank = sum(gas) - sum(cost)记录环行过程中油箱里剩下的油,如果 gas[i] - cost[i] < 0 ,则不可能从这个加油站出发,因为在前往 i + 1 的过程中,汽油就不够了。
算法:
1.初始化 total_tank 和 curr_tank 为 0 ,并且选择 0 号加油站为起点。
2.遍历所有的加油站:
(1)每一步中,都通过加上 gas[i] 和减去 cost[i] 来更新 total_tank 和 curr_tank。
(2)如果在 i 号加油站, curr_tank < 0 ,将 i + 1 号加油站作为新的起点,同时重置 curr_tank = 0 ,让油箱也清空。
3.如果 total_tank < 0 ,返回 -1 ,否则返回 start。
3.代码
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total_tank = 0;
int curr_tank = 0;
int start = 0;
for(int i =0;i < gas.size();++i){
total_tank += gas[i] - cost[i];
curr_tank += gas[i] - cost[i];
if(curr_tank < 0){
curr_tank = 0;
start = i + 1;
}
}
return total_tank >= 0 ? start : -1;
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)