欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

134. 加油站

程序员文章站 2024-03-09 14:10:35
...

1.题目描述

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
1.如果题目有解,该答案即为唯一答案。
2.输入数组均为非空数组,且长度相同。
3.输入数组中的元素均为非负数。
示例 1:
134. 加油站
示例 2:
134. 加油站

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)