Medium草稿★★★★★O(n log n) 時間 · O(1) 空間
ArraySortingGreedyIntervals
Patterns📊 區間合併・排程🪙 貪心🔢 排序後處理
尚未複習過

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

435Non-overlapping IntervalsIntervalsMediumIntervals

給定一個區間的集合 intervals,求最少需要移除多少個區間才能讓剩下的區間互不重疊。

Example:

Input: intervals = [[1,2],[2,3],[3,4],[1,3]] Output: 1

Intuition

TIP

等價問題:最多能保留多少個互不重疊的區間?用貪心策略每次選結束最早的區間。

Approaches

1. Sort by Start + Count Overlaps — O(n log n) / O(1)
  • Idea: 按起點排序,遇到重疊時移除 end 較大的那個(貪心保留 end 較小的)
  • Time: O(n log n)
  • Space: O(1) — 不計排序空間
class Solution {
    fun eraseOverlapIntervals(intervals: Array<IntArray>): Int {
        intervals.sortBy { it[0] }
        var count = 0
        var prevEnd = intervals[0][1]
        for (i in 1 until intervals.size) {
            if (intervals[i][0] < prevEnd) {
                count++
                prevEnd = minOf(prevEnd, intervals[i][1])
            } else {
                prevEnd = intervals[i][1]
            }
        }
        return count
    }
}
⭐ 2. Sort by End + Greedy Scheduling — O(n log n) / O(1)
  • Idea: 按終點排序,貪心選取不重疊的區間,最大化保留數量
  • Time: O(n log n)
  • Space: O(1) — 不計排序空間
class Solution {
    fun eraseOverlapIntervals(intervals: Array<IntArray>): Int {
        intervals.sortBy { it[1] }
        var kept = 1
        var prevEnd = intervals[0][1]
        for (i in 1 until intervals.size) {
            if (intervals[i][0] >= prevEnd) {
                kept++
                prevEnd = intervals[i][1]
            }
        }
        return intervals.size - kept
    }
}

🔑 Takeaways

Ladders 看全部 →

📏

區間問題

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

  1. 1#252Meeting RoomsEasy能否全部參加 → 判有無重疊
  2. 2#253Meeting Rooms IIMedium需要幾間會議室 → 掃描線 / 最小堆
  3. 3#56Merge IntervalsMedium合併所有重疊區間
  4. 4#57Insert IntervalMedium插入新區間並就地合併
  5. 5