Problem#
給你一堆不重疊的區間 intervals[i] = (s_i, e_i)
,今天有個新的區間 newInterval
,如果有重疊,則只留下最大區間,問你最後的區間 array 長怎樣
- 輸入
- $N \le 10^4$ (
intervals.size()
) - $0 \le s_i \le e_i \le 10^5$
- $N \le 10^4$ (
想法#
重疊要怎麼判斷: 兩種情況疊左邊或是疊右邊 a[1] >= b[0] && b[1] >= a[0]
。
先掃過一遍,重疊的話紀錄 index 以及最小左界 interval[0]
和最大右界 interval[1]
和代表重疊後剩下的區間 $k$
接著再掃一遍 interval ($i = [1, n)$) ,如果有重疊則把區間 $k$ 加到解中(一個就好),如果沒有則直接把區間 $i$ 加到解中。
注意邊界條件: 如果重疊的區間,記得把 newInterval
也加到解中,懶得寫插入可以直接 sort 一下
- 時間複雜度: $\mathcal{O}(n)$ 如果掃一次插入,懶人 sort $\mathcal{O}(n\log{n})$
- 空間複雜度: $\mathcal{O}(n)$
AC Code#
2024/03/18: 2nd try 用 bitset
心得#
原本卡在最後蒐集解區間,後來發現直接紀錄有重疊的 index i.e. overlap[i]
代表第 i 個區間是跟別人重疊的,用於後面判斷。