[LeetCode刷题日记(Day24)]:Gas Station

Problem 134. Gas Station

  • 题目描述
    There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

    You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

    Return the starting gas station’s index if you can travel around the circuit once in the clockwise direction, otherwise return -1.

    Note:

    • If there exists a solution, it is guaranteed to be unique.
    • Both input arrays are non-empty and have the same length.
    • Each element in the input arrays is a non-negative integer.

    Example

    Input: 
    gas  = [1,2,3,4,5]
    cost = [3,4,5,1,2]
    
    Output: 3
    
    Explanation:
    Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
    Travel to station 4. Your tank = 4 - 1 + 5 = 8
    Travel to station 0. Your tank = 8 - 2 + 1 = 7
    Travel to station 1. Your tank = 7 - 3 + 2 = 6
    Travel to station 2. Your tank = 6 - 4 + 3 = 5
    Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
    Therefore, return 3 as the starting index.
    
  • 解题思路
    本题大意是:在环形的线路上有 N 个加油站,第i个加油站的油量为 gas[i],从第 i 个加油站到第 i+1 个加油站需要消耗的油量问 cost[i],汽车的起始油量为 0,问是否能找到一个唯一的加油站作为起点,使得汽车能够环绕线路一周?

经过分析可知道,如果加油站的总油量不小于环绕一周需要消耗的总油量,则汽车总能够完成环绕行驶。解题思路如下:

  1. 令 start 表示汽车的出发点,并初始化为 0。rest 为当前剩下的油量,total 为加油站的油量总和减去消耗油量的总和,对 cost 和 gas 进行遍历;
  2. 令 rest += gas[i] - cost[i],表示行驶到下一站还剩下的油量。若 res 大于等于 0,则继续行驶;若 rest 小于0,则表示汽车从 start 开始出发,不能够走到第 i+1 个加油站,自然也无法环绕一周。所以需要将出发的站点 start 设置为 i+1,并重置 rest 为0;
  3. 遍历完后判断 total 的大小,如果 total 小于 0 表示无法完成环绕,返回 -1;否则返回 start。
  • 代码实现
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start = 0, rest = 0, total = 0;
        for(int i = 0; i < gas.size(); ++i){
            rest += gas[i] - cost[i];
            total += gas[i] - cost[i];
            if(rest < 0){
                rest = 0;
                start = i+1;
            }
        }
        return (total < 0)? -1 : start;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值