前往
大廳
主題

LeetCode - 986. Interval List Intersections 解題心得

Not In My Back Yard | 2021-11-07 00:00:03 | 巴幣 0 | 人氣 140

題目連結:


題目意譯:
你被給定兩個閉區間之列表 firstList 和 secondList ,其中 firstList[i] = [starti, endi] 且 secondList[j] = [startj, endj]。每個區間列表為兩兩區間之間互不相交且以升序排序。

回傳這兩個區間列表的交集。

一個閉區間 [a, b](其中 a < b)代表著一個實數 x 之集合其滿足 a ≦ x ≦ b。

兩個閉區間的交集為一個實數之集合,其要嘛為空要嘛表為一個閉區間。例如,[1, 3] 和 [2, 4] 的交集為 [2, 3]。

限制:
0 ≦ firstList.length 、 secondList.length ≦ 1000
firstList.length + secondList.length ≧ 1
0 ≦ starti < endi ≦ 10 ^ 9
endi < starti + 1
0 ≦ startj < endj ≦ 10 ^ 9
endj < startj + 1



範例測資:
範例 1:
輸入: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
輸出: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

範例 2:
輸入: firstList = [[1,3],[5,9]], secondList = []
輸出: []

範例 3:
輸入: firstList = [], secondList = [[4,8],[10,12]]
輸出: []

範例 4:
輸入: firstList = [[1,7]], secondList = [[3,10]]
輸出: [[3,7]]


解題思維:
利用兩個指標 p1 、 p2 指向兩個列表的第一個元素(如果有的話;沒有就直接回傳一個空列表即可,因為不可能有重疊的區間),然後重複以下步驟直到 p1 或是 p2 其中一者已經將其所屬的列表跑完了:
令 L 為 p1 、 p2 兩者的左端點之最大值、R 為 p1 、 p2 兩者右端點的最小值。

當 L ≦ R 時,我們便找到一個重疊的區間 [L, R](由 p1 、p2 重疊而得到);反之則代表 p1 、 p2 沒有任何重疊部分。

接著判斷 p1 的右端點是否小於 p2 的右端點。如果是的話,則代表將 firstList 、 secondList 兩個列表合併後按照右端點排序之後,p1 將排在 p2 的前面(不一定是前一個位置)。因此我們將 p1 指向 firstList 中的下一個區間(也就是 p1 將於排序後的位置越接近 p2 直至超過);反之,則將 p2 指向 secondList 中的下一個區間。



如上,掃完之後便可以得到兩個區間列表所有可能重疊的區間部分(因為每次我們都是取盡可能接近的兩個區間來判斷有無重疊)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作