###### 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)
```