美文网首页
[刷题防痴呆] 0134 - 加油站 (Gas Station)

[刷题防痴呆] 0134 - 加油站 (Gas Station)

作者: 西出玉门东望长安 | 来源:发表于2022-01-10 10:10 被阅读0次

题目地址

https://leetcode.com/problems/gas-station/

题目描述

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.

思路

  • 贪心法.
  • 结论1: 若从加油站A出发, 恰好无法到达加油站C(只能到达C的前一站),则A与C之间的任何一个加油站B均无法到达C.
  • 结论2: 若储油量总和sum(gas) >= 耗油量总和sum(cost), 则问题一定有解.

关键点

  • for循环.
  • totalTank += gas - cost. curTank += gas - cost.
  • 如果curTank >= 0, 就证明可以继续往前. 不然需要从下一个station重头开始. startIndex = i + 1. curTank = 0.
  • 最后判断totalTank是否 >= 0, 如果 >= 0, 返回startIndex, 不然就返回-1.

代码

  • 语言支持:Java
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        if (gas == null || cost == null || gas.length == 0 || cost.length == 0) {
            return -1;
        }
        int totalTank = 0;
        int curTank = 0;
        int startIndex = 0;
        for (int i = 0; i < gas.length; i++) {
            int diff = gas[i] - cost[i];
            totalTank += diff;
            curTank += diff;
            if (curTank < 0) {
                curTank = 0;
                startIndex = i + 1;
            }
        }

        if (totalTank >= 0) {
            return startIndex;
        }
        return -1;
    }
}

相关文章

网友评论

      本文标题:[刷题防痴呆] 0134 - 加油站 (Gas Station)

      本文链接:https://www.haomeiwen.com/subject/wjtiqrtx.html