题目
给定一个非负整数的数据流输入 a1,a2,…,an,…,将到目前为止看到的数字总结为不相交的区间列表。
例如,假设数据流中的整数为 1,3,7,2,6,…,每次的总结为:
[1, 1] [1, 1], [3, 3] [1, 1], [3, 3], [7, 7] [1, 3], [7, 7] [1, 3], [6, 7]
进阶:
如果有很多合并,并且与数据流的大小相比,不相交区间的数量很小,该怎么办?
解法
class SummaryRanges {
List<int[]> list;
Set<Integer> set;
/** Initialize your data structure here. */
public SummaryRanges() {
list = new ArrayList<>();
set = new HashSet();
}
public void addNum(int val) {
if(set.contains(val)){
return;
}
set.add(val);
for(int i = 0; i < list.size(); i++){
if(list.get(i)[0] > val){
if(list.get(i)[0] == val+1){
list.get(i)[0] =val;
}else{
int[] o = new int[]{val,val};
list.add(i, o);
}
return;
}
if(list.get(i)[1] > val){
return;
}
if(list.get(i)[1] == val - 1){
list.get(i)[1] = val;
if(i < list.size()-1 && list.get(i+1)[0] == val+1){
list.get(i+1)[0] = list.get(i)[0];
list.remove(i);
}
return;
}
}
if(list.size()>0 && list.get(list.size()-1)[1] == val-1){
list.get(list.size()-1)[1] = val;
}else{
int[] o = new int[]{val,val};
list.add(o);
}
}
public int[][] getIntervals() {
int[][] res = new int[list.size()][];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
}