題目描述:給定兩個由已排序、不相交區間所組成的列表 firstList 和 secondList,求兩個列表的所有交集(重疊部分),並回傳結果陣列。若 firstList = [[0,2],[5,10]],secondList = [[1,5],[8,12]],則交集為 [[1,2],[5,5],[8,10]]。
解題思路:使用雙指針分別指向 firstList[i] 和 secondList[j]。對於當前兩個區間 a = firstList[i]、b = secondList[j]:
lo = max(a[0], b[0]),hi = min(a[1], b[1])。lo <= hi,代表兩個區間有重疊,將 [lo, hi] 加入結果。a[1] <= b[1] 則 i++,否則 j++。重複直到其中一個指針越界,時間複雜度為 O(m + n)。
時間複雜度:O(m + n) — 每次迴圈至少有一個指針前進,兩個指針最多各移動 m 和 n 步,總計 O(m + n)。
空間複雜度:O(1) — 不計輸出結果的空間,只使用兩個指針變數。輸出最多包含 O(m + n) 個交集區間。
Function intervalIntersection(firstList, secondList):
result = []
i = 0, j = 0
While i < len(firstList) and j < len(secondList):
a = firstList[i], b = secondList[j]
lo = max(a.start, b.start)
hi = min(a.end, b.end)
If lo <= hi:
Append [lo, hi] to result
If a.end <= b.end:
i = i + 1 // firstList 的當前區間已耗盡
Else:
j = j + 1 // secondList 的當前區間已耗盡
Return result排序合併(不適用此題):此題兩個列表已保證有序且不相交,因此無需額外排序。若輸入為無序的混合區間,則先合併後排序,再用掃描線找交集,時間複雜度為 O((m + n) log(m + n))。
事件掃描線 O((m + n) log(m + n)):將所有區間的 start 和 end 轉為帶有 +1/-1 標記的事件,排序後掃描。當覆蓋計數等於 2 時,當前區段即為交集。邏輯較複雜,但可推廣至多個列表同時求交集的情境。
二分搜尋 O(m log n 或 n log m):對 firstList 中每個區間,在 secondList 中用二分搜尋找可能重疊的區間範圍。適用於 m << n 的不對稱情況,但常數較大,不如雙指針直觀。