iT邦幫忙

2025 iThome 鐵人賽

0

Non-overlapping Intervals

LeetCode 435 題意

  • 給定一組區間,移除最少數量的區間,使得剩下的區間互不重疊。
  • 回傳需要移除的區間數量。
  • Ex.
    Input: [[1,2],[2,3],[3,4],[1,3]]
    Output: 1 (移除 [1,3])

thoughts

  • Greedy
  • 按照區間結束點排序。
  • 遍歷區間,維護一個 end:
    • 若當前區間起點 < end → 需要刪除(計數 +1)。
    • 否則更新 end = 當前區間結束點。
  • 時間:O(n log n)
  • 空間:O(1)

Kotlin

fun eraseOverlapIntervals(intervals: Array<IntArray>): Int {
    if (intervals.isEmpty()) return 0
    intervals.sortBy { it[1] }

    var count = 0
    var end = intervals[0][1]

    for (i in 1 until intervals.size) {
        if (intervals[i][0] < end) {
            count++  // 重疊,刪除當前
        } else {
            end = intervals[i][1]
        }
    }
    return count
}

Follow-up

  • 如果區間是動態新增的,如何即時計算?
  • 如果允許部分重疊(例如允許最多 k 個重疊),如何改?
  • 如何應用在行程排程 / CPU 時間片分配?

上一篇
#25
下一篇
#27
系列文
來都來了-涮就涮吧28
  1. 24
    #23
  2. 25
    #24
  3. 26
    #25
  4. 27
    #26
  5. 28
    #27
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言