###### tags: `Leetcode` `medium` `greedy` `python` # 134. Gas Station ## [題目連結:] https://leetcode.com/problems/gas-station/ ## 題目: There are n gas stations along a circular route, where the amount of gas at the ```ith``` station is ```gas[i]```. You have a car with an unlimited gas tank and it costs ```cost[i]``` of gas to travel from the ```ith``` station to its next ```(i + 1)th``` station. You begin the journey with an empty tank at one of the gas stations. Given two integer arrays ```gas``` and ```cost```, return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return ```-1```. If there exists a solution, it is **guaranteed** to be **unique** **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[i],再出發耗油cost[i] * ex:gas = [1,2,3,4,5], cost = [3,4,5,1,2] * gas[0]=1: 表示從第0站可以加1格油 * cost[0]=3: 從第0站開到第1站會耗3格油 * 求是否能順利繞一圈 * 不夠的話return -1 * 夠的話求從哪個位置出發(只會有一個答案) * 想法: * 法1: 若暴力法每一個都嘗試走一圈: O(n**2) :cry: * 法2: **Greedy: O(N)** * startPos=0 : 起點從0開始 * total=0 :紀錄總和 * total+=gas[pos]-cost[pos] * 最終遍歷完所有位置後若為負,表示哪個位置出發都無法順利繞一圈:return -1 * curSum=0: 紀錄當前總和 * curSum+=gas[pos]-cost[pos] * **若curSum為負,表示該位置不可能為起點** * 所以**startPos=pos+1** (移到下個位置測試) * curSum清為0 * 若curSum為正,表示該位置**有機會**為起點,正常遍歷下個pos ## Python: ``` python= class Solution(object): def canCompleteCircuit(self, gas, cost): """ :type gas: List[int] :type cost: List[int] :rtype: int """ #O(n) startPos=0 total=0 curSum=0 for pos in range(len(gas)): total+=gas[pos]-cost[pos] curSum+=gas[pos]-cost[pos] if curSum<0: curSum=0 #pos到不了 則之前 0~pos-1皆到不了 startPos=pos+1 if total<0: return -1 return startPos gas = [1,2,3,4,5] cost = [3,4,5,1,2] result = Solution() ans = result.canCompleteCircuit(gas,cost) print(ans) ```