【区间合并TreeMap】借鉴一位大佬的思路,利用TreeMap<start, [start, end]>,以左端点为key,整个区间为value进行记录,当添加区间的时候,通过map.floorKey(right)来不断找第一个左端点<新区间右端点的区间,如果该区间的右端点>=新区间左端点,就把两个区间进行合并,直到找不到这样的端点为止。
class CountIntervals {
TreeMap<Integer, int[]> set = new TreeMap();
int num = 0;
public CountIntervals() {
}
public void add(int left, int right) {
int l = left, r = right;
var key = set.floorKey(r);
while(key != null && set.get(key)[1] >= left){
int tl = set.get(key)[0], tr = set.get(key)[1];
num -= tr - tl + 1;
set.remove(key);
l = Math.min(tl, l);
r = Math.max(tr, r);
key = set.floorKey(r);
}
num += r - l + 1;
set.put(l, new int[] {l, r});
}
public int count() {
return num;
}
}
/**
* Your CountIntervals object will be instantiated and called as such:
* CountIntervals obj = new CountIntervals();
* obj.add(left,right);
* int param_2 = obj.count();
*/