1. 程式人生 > >leetcode 134. Gas Station

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.

解法:

這個題意圖在於,讓我們找出從在一定條件下(保證每一步上的當前 GAS 與剩餘的 GAS 的總和大於到達下一個位置的 COST)從哪一個節點上可以完成的對陣列的遍歷。

如果要完成遍歷,那麼我們還得保證gas的總和要大於等於 cost的總和,這樣才能走完全程。

example 1為例:設總剩餘的 gas 為 total ,當前步驟上剩餘的油量為 left

  • 從 gas[o] 出發,此時 left = 1 - 3 = - 2 < 0 ,此時顯然不滿足條件,那麼我們就嘗試從下一個結點開始走,此時total = - 2 ;
  • 從 gas[1] 出發,此時 left = 3 - 4 = - 1 < 0 ,此時顯然不滿足條件,那麼我們就嘗試從下一個結點開始走 ,此時total = - 3 ;
  • 從 gas[2] 出發,此時 left = 3 - 5 = - 2 < 0 , 此時顯然不滿足條件,那麼我們就嘗試從下一個結點開始走 ,此時total = - 5 ;
  • 從 gas[3] 出發,此時 left = 4 - 1 = 3 > 0 , 此時滿足條件,證明 gas[3] 可以作為一個出發點,此時 total = -2,但是這裡我們要保證從 gas[3] 出發一定能再回到 gas[3] ,這時候就用到 total這個變量了,在下一步我們繼續進行運算
  • 從 gas[3] 到達 gas[4] 後,left = 5 - 2 = 3 > 0 , 且此時total = 3 + (-2) = 1 > 0 ,且此時陣列已經到達結尾,這就證明我們是可以完成遍歷的。

綜上所述,我們得到的結論就是,從某個結點開始進行遍歷,那麼這個結點往後走直到再回來的剩餘油量一定要大於等於在這條路上某個結點到下一個結點的流量差值(負數)的和


程式碼:

class Solution {
public:
    int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
        int total = 0, sum = 0, start = 0;
        for (int i = 0; i < gas.size(); ++i) {
            total += gas[i] - cost[i];
            sum += gas[i] - cost[i];
            if (sum < 0) {
                //更新起始結點
                start = i + 1;
                sum = 0;
            }
        }
        //判斷能否走完
        if (total < 0) return -1;
        else return start;
    }
};