3 回答

TA貢獻1784條經驗 獲得超9個贊
將間隔的端點放入數組中,將其標記為起點或終點。如果間隔是封閉的,則通過將端點放在起點之前來打破平局來對它們進行排序,如果間隔是半開放的,則將它們放在相反的位置。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
然后遍歷該列表,跟蹤我們處于多少間隔(這等于已處理的起點數減去終點數)。每當我們已經處于一個間隔中而到達起點時,這意味著我們必須具有重疊的間隔。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
^ ^
overlap overlap
通過在端點旁邊存儲數據并跟蹤我們所處的間隔,我們可以找到哪些間隔與哪些間隔重疊。
這是一個O(N logN)解決方案,其中排序是主要因素。

TA貢獻1796條經驗 獲得超4個贊
在線間隔問題的標準方法是根據起點對它們進行排序,然后從頭到尾走動。O(n*logn)(O(n)如果已經排序)
end = 0;
for (current in intervals) {
if current.start < end {
// there's an intersection!
// 'current' intersects with some interval before it
...
}
end = max(end, current.end)
}
添加回答
舉報