Leetcode 134 Gas Station

Leetcode 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 1:
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.

Example 2:
Input:
gas = [2,3,4]
cost = [3,4,3]
Output: -1
Explanation:
You can’t start at station 0 or 1, as there is not enough gas to travel to the next station.
Let’s start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 0. Your tank = 4 - 3 + 2 = 3
Travel to station 1. Your tank = 3 - 3 + 3 = 3
You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
Therefore, you can’t travel around the circuit once no matter where you start.

思路

首先判断是否可能,很容易想到是判断总油量和总花费的大小,如果前者大于等于后者那么可以,此时需要找到起点。
看example1,此时的差值为 [ − 2 , − 2 , − 2 , 3 , 3 ] [-2,-2,-2,3,3] [2,2,2,3,3],然后当前累计差值为 [ − 2 , − 4 , − 6 , − 3 , 0 ] [-2,-4,-6,-3,0] [2,4,6,3,0],我们发现从 i n d e x = 3 index=3 index=3开始正好是在当前差值最小-6的后一个位置开始,从3开始的当前累计差值为 [ 3 , 6 , 4 , 2 , 0 ] [3,6,4,2,0] [3,6,4,2,0].

因为有用的信息只有gas和cost数列的差值,以下只讨论差值。
再来看别的例子,例如差值 [ − 1 , 4 , − 5 , 1 , − 3 , 6 ] [-1,4,-5,1,-3,6] [1,4,5,1,3,6],显然答案应该是从正数开始的,有以下几种情况
i n d e x = 1 index=1 index=1开始,累计差值为 [ 4 , − 1 , 0 , − 3 , 3 , 2 ] [4,-1,0,-3,3,2] [4,1,0,3,3,2]
i n d e x = 3 index=3 index=3开始,累计差值为 [ 1 , − 2 , 4 , 3 , 7 , 2 ] [1,-2,4,3,7,2] [1,2,4,3,7,2]
i n d e x = 5 index=5 index=5开始,累计差值为 [ 6 , 5 , 9 , 4 , 5 , 2 ] [6,5,9,4,5,2] [6,5,9,4,5,2]
出现负数则说明不可行,所以唯一可行的是 i n d e x = 5 index=5 index=5,通过这个例子我们也可以发现,不论如何旋转这个数列(从不同的位置开始),从累计差值最小的下一项开始一定是可行的,因为数列整体是可行的,所以结束的时候累计差值一定非负,从最小的开始可以直观上理解成先实现最大跨度的增长再去减少,期间也不会减小至小于0。
考虑用pSum记录累计差值,minSum记录当前最小累计差值,index为取到的位置+1,代码如下。

代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int index = 0;
        int pSum = 0, minSum = 0;
        for (int i = 0; i < gas.length; i++) {
            pSum += gas[i] - cost[i];
            if (pSum < minSum) {
                index = i + 1;
                minSum = pSum;
            }
        }
        if (pSum < 0) return -1;
        return index;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值