Medium草稿★★★★★O(n log n) 時間 · O(n) 空間
Patterns🧹 差分・掃描線⛰️ 堆・Top-K
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1094Car PoolingHeap / Priority QueueMediumHeap / Priority Queue

一輛車有 capacity 個座位,沿一條路線行駛。給定 trips[i] = [numPassengers, from, to],表示第 i 趟行程在 from 上車 numPassengers 人,在 to 下車。判斷是否能完成所有行程而不超過座位上限。

Example:

Input: trips = [[2,1,5],[3,3,7]], capacity = 4 Output: false

Intuition

TIP

核心思路:用差分陣列或事件排序計算每個位置的乘客數,檢查是否超過容量。

Approaches

1. Difference Array — O(n + maxStop) / O(maxStop)
  • Idea: 用陣列記錄每個位置的乘客變化量,累加後檢查是否超過容量
  • Time: O(n + maxStop) - n 為行程數
  • Space: O(maxStop)
class Solution {
    fun carPooling(trips: Array<IntArray>, capacity: Int): Boolean {
        val diff = IntArray(1001)

        for (trip in trips) {
            diff[trip[1]] += trip[0]
            diff[trip[2]] -= trip[0]
        }

        var current = 0
        for (d in diff) {
            current += d
            if (current > capacity) return false
        }

        return true
    }
}
⭐ 2. Event Sorting (Sweep Line) — O(n log n) / O(n)
  • Idea: 將上下車轉為事件(上車 +人數,下車 -人數),按位置排序後掃描
  • Time: O(n log n)
  • Space: O(n)
class Solution {
    fun carPooling(trips: Array<IntArray>, capacity: Int): Boolean {
        val events = mutableListOf<IntArray>()

        for (trip in trips) {
            events.add(intArrayOf(trip[1], trip[0]))   // 上車
            events.add(intArrayOf(trip[2], -trip[0]))  // 下車
        }

        // 按位置排序,同位置先下車再上車
        events.sortWith(compareBy({ it[0] }, { it[1] }))

        var current = 0
        for (event in events) {
            current += event[1]
            if (current > capacity) return false
        }

        return true
    }
}

🔑 Takeaways