Count Integers in Intervals
題目描述:
設計一個資料結構,支援兩個操作:add(left, right) 將區間 [left, right] 加入集合,count() 回傳集合中包含的不同整數數量(重疊的只算一次)。
解題思路:
使用有序映射(C++ 的 map)維護互不重疊的區間集合。
- 用
map<int, int> 存儲區間,key = left,value = right。保持所有區間互不重疊。
- add(left, right):
- 找到所有與 [left, right] 重疊的現有區間。
- 合併它們:新的 left 取所有重疊區間左端的最小值,新的 right 取所有重疊區間右端的最大值。
- 刪除所有被合併的舊區間,插入新的合併區間。
- 更新計數:加上新增的整數數量。
- count():直接回傳維護的計數值。
使用 map 的 lower_bound 可以高效找到需要合併的區間。
時間複雜度:add 均攤 O(log n),count O(1) — 每個區間最多被合併(刪除)一次,add 的總代價均攤為 O(n log n)(n 次操作)。
空間複雜度:O(n) — 最多存儲 n 個互不重疊的區間。