↓快轉到主要內容
  1. LeetCode/

LeetCode 134: Gas Station

·1 分鐘· ·
LeetCode Medium Array Greedy
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-11

  • 提交紀錄:Accepted ×2

解題思路
#

兩個觀察(Greedy):

  1. sum(gas) < sum(cost) 就不可能繞一圈。
  2. 從起點 s 出發,第一次在 i 油箱變負,那 s 到 i 之間的任何一站當起點也到不了 i + 1:從 s 走到中間那站時油箱是非負的,從那站重新開始只會更少。所以直接把起點跳到 i + 1、油箱歸零。

總油量夠的時候,最後剩下的起點就是答案(題目保證答案唯一)。

我的嘗試
#

兩次都一次 AC,都是上面這個貪心。

正確解法
#

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas) < sum(cost):
            return -1
        start = tank = 0
        for i in range(len(gas)):
            tank += gas[i] - cost[i]
            if tank < 0:
                start, tank = i + 1, 0
        return start

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 先檢查總油量,不然最後的 start 不一定能繞完一圈。
  • 油箱變負時起點跳到 i + 1,不是 start + 1。

面試口說整理
#

總油量比總花費少就不可能。否則我從左往右累加油量減花費,變成負的就代表從目前的起點到這裡之間都不能當起點,把起點移到下一站重新算,最後的起點就是答案。時間 O(n)。

相關文章

LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 162: Find Peak Element
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 162 解題筆記:nums[mid] < nums[mid + 1] 代表右邊一定有山峰(一路上升最後也會碰到邊界),否則左邊(含 mid)一定有
LeetCode 189: Rotate Array
·1 分鐘
LeetCode Medium Array Math Two-Pointers
LeetCode 189 解題筆記:先 k %= n,再用三次反轉:整個反轉、前 k 個反轉、後 n - k 個反轉;O(1) 額外空間
LeetCode 204: Count Primes
·1 分鐘
LeetCode Medium Array Math Enumeration Number-Theory
LeetCode 204 解題筆記:埃氏篩,只用質數 p 從 p² 開始把倍數劃掉,外層只要到 √n
LeetCode 106: Construct Binary Tree from Inorder and Postorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 106 解題筆記:後序的最後一個是根;從後序尾巴往前取根時,要先建右子樹再建左子樹
LeetCode 137: Single Number II
·1 分鐘
LeetCode Medium Array Bit-Manipulation
LeetCode 137 解題筆記:其他數都出現三次,逐位元統計 1 的個數取 mod 3,剩下的位元就是答案;注意負數