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

LeetCode 853: Car Fleet

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

基本資料
#

難易度: Medium 第一次嘗試: 2025-08-10

  • 總花費時間:00:00.00

解題思路
#

每輛車都有到達目標位置的時間。我們可以按照車輛位置排序,從距離目標最近的車開始遍歷到最遠的車。如果一輛車的到達時間小於或等於堆疊中最後一輛車的到達時間,就表示這輛車會追上並與前面的車形成車隊。

解法
#

這個解決方案使用堆疊方法,包含以下步驟:

  1. 計算到達時間:對於每輛車,使用 (target - position) / speed 計算到達目標所需的時間
  2. 按位置排序:按照車輛位置降序排列(距離目標最近的車優先)
  3. 堆疊處理:使用堆疊來追蹤形成車隊的車輛
  4. 車隊形成:如果一輛車能追上前面的車(到達時間 ≤ 前車到達時間),它就加入車隊
class Solution:
    def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
        position_rate = [(position[i], (target - position[i]) / speed[i]) for i in range(len(position))]
        position_rate.sort(key=lambda x: (x[0], -x[1]))
        stack = []

        for position, time_to_end in position_rate:
            while stack and stack[-1][1] <= time_to_end: # 表示會追上
                stack.pop()
            
            stack.append((position, time_to_end))

        return len(stack)

時間複雜度:O(n log n),主要來自排序 空間複雜度:O(n),用於堆疊儲存

收穫
#

  • 堆疊方法:使用堆疊來追蹤車隊既有效率又直觀
  • 位置排序:按照距離目標的遠近排序車輛,簡化了車隊形成的邏輯
  • 追趕條件:關鍵洞察是如果一輛車的到達時間 ≤ 前車到達時間,它們就形成車隊
  • 貪心特性:這個問題展示了貪心方法,我們按順序處理車輛並在每一步做出最佳決策

遇到的問題
#

相關文章

LeetCode 739: Daily Temperatures
·1 分鐘
LeetCode Daily Medium Array Stack Monotonic-Stack Data-Structures Temperature Waiting-Time
使用單調堆疊解決每日溫度問題
LeetCode 503: Next Greater Element II(單調棧)
·1 分鐘
LeetCode Daily Medium Array Stack Monotonic-Stack Circular-Array
單調棧、環狀陣列
LeetCode 3627: Maximum Median Sum of Subsequences of Size 3
·1 分鐘
LeetCode Medium Math Greedy Sorting Game-Theory Array
LeetCode 3627 解題筆記:排序後每次拿最大的兩個和最小的一個,中位數是第二大的;答案是從尾端往前每隔一個取,共 n / 3 個
LeetCode 2410: Maximum Matching of Players With Trainers
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 2410 解題筆記:兩邊都排序後,用同向雙指針讓最弱的球員配最小的、夠用的教練
LeetCode 735: Asteroid Collision
·1 分鐘
LeetCode Medium Array Stack Simulation
LeetCode 735 解題筆記:從左到右用 stack,只有「stack 頂端往右、目前的往左」才會相撞,小的爆掉,一樣大一起爆
LeetCode 3075: Maximize Happiness of Selected Children
·1 分鐘
LeetCode Medium Array Greedy Sorting
LeetCode 3075 解題筆記:由大到小選 k 個,第 i 個選的會被扣 i,扣到 0 為止