iT邦幫忙

2025 iThome 鐵人賽

0

Merge Intervals

LeetCode 56 題意

  • 給定一組區間,可能互相重疊,請合併所有重疊區間,並回傳合併後的區間集合。
  • Ex.
    Input: [[1,3],[2,6],[8,10],[15,18]]
    Output: [[1,6],[8,10],[15,18]]

解題思路

  • 按區間起點排序。
  • 依次處理:
    • 如果當前區間與結果最後一個區間重疊,合併。
    • 否則,直接加入結果。
  • 時間:O(n log n)(排序主導)
  • 空間:O(n)

Kotlin

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

    val merged = mutableListOf<IntArray>()
    var current = intervals[0]

    for (i in 1 until intervals.size) {
        if (intervals[i][0] <= current[1]) {
            current[1] = maxOf(current[1], intervals[i][1])
        } else {
            merged.add(current)
            current = intervals[i]
        }
    }
    merged.add(current)
    return merged.toTypedArray()
}

Follow-up

  • 如何在不排序的情況下處理(例如輸入已經是排序好的)?
  • 如果數據量非常大,是否能線上 (streaming) 合併?
  • 如何擴展到三維區間 (cube intervals)?

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

尚未有邦友留言

立即登入留言