Medium草稿★★★★★O(n log n) 時間 · O(n) 空間
ArraySortingHeapIntervalsSweep Line
Patterns🧹 差分・掃描線⛰️ 堆・Top-K📊 區間合併・排程🔢 排序後處理
尚未複習過

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

253Meeting Rooms IIIntervalsMediumIntervals

給定一個會議時間區間的陣列 intervals,求同時進行的會議最多需要多少間會議室。

Example:

Input: intervals = [[0,30],[5,10],[15,20]] Output: 2

WARNING

此題為 LeetCode Premium 題目。以下解法基於題目描述撰寫。

Intuition

TIP

找「同時進行的最大會議數」,等價於掃描線找最大重疊深度。

Approaches

1. Min-Heap (Priority Queue) — O(n log n) / O(n)
  • Idea: 按起點排序後,用 min-heap 追蹤正在進行的會議的結束時間。如果最早結束的會議已經結束,就釋放那間會議室。
  • Time: O(n log n)
  • Space: O(n)
class Solution {
    fun minMeetingRooms(intervals: Array<IntArray>): Int {
        intervals.sortBy { it[0] }
        val heap = java.util.PriorityQueue<Int>()
        for (interval in intervals) {
            if (heap.isNotEmpty() && heap.peek() <= interval[0]) {
                heap.poll()
            }
            heap.add(interval[1])
        }
        return heap.size
    }
}
⭐ 2. Sweep Line (Event Sorting) — O(n log n) / O(n)
  • Idea: 將所有起點和終點拆成事件,排序後掃描,追蹤同時進行的會議數
  • Time: O(n log n)
  • Space: O(n)
class Solution {
    fun minMeetingRooms(intervals: Array<IntArray>): Int {
        val starts = intervals.map { it[0] }.sorted().toIntArray()
        val ends = intervals.map { it[1] }.sorted().toIntArray()
        var rooms = 0
        var maxRooms = 0
        var s = 0; var e = 0
        while (s < starts.size) {
            if (starts[s] < ends[e]) {
                rooms++
                maxRooms = maxOf(maxRooms, rooms)
                s++
            } else {
                rooms--
                e++
            }
        }
        return maxRooms
    }
}

🔑 Takeaways

Ladders 看全部 →

📏

區間問題

排序後一切變簡單:判重疊、合併、貪心。

  1. 1#252Meeting RoomsEasy能否全部參加 → 判有無重疊
  2. 2
  3. 3#56Merge IntervalsMedium合併所有重疊區間
  4. 4#57Insert IntervalMedium插入新區間並就地合併
  5. 5#435Non-overlapping IntervalsMedium移除最少區間使不重疊 → 貪心