思路:采用一个TreeMap的数据结构,因为TreeMap内部是红黑树的数据结构,整体是有序的,而且还可以很快的搜索到大于某个元素的项及小于某个元素的项。
但是不清楚为什么,我代码提交后一直提示Memory Limit Exceeded。我在网上找了一份相似的代码,见代码2,就可以AC,有知道原因的望不吝赐教。
代码如下:
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
import java.util.*;
public class SummaryRanges {
TreeMap<Integer,Interval> maps;
/** Initialize your data structure here. */
public SummaryRanges() {
maps = new TreeMap<>();
}
public void addNum(int val) {
Map.Entry<Integer,Interval> ceilEntry = maps.ceilingEntry(val);//much higher
Map.Entry<Integer,Interval> floorEntry = maps.floorEntry(val);//much lower
boolean insertFloor = false,insertCeil = false;
if(floorEntry != null){
Interval floorInterval = floorEntry.getValue();
if(floorInterval.end >= val-1){
floorInterval.end = Math.max(floorInterval.end,val);
insertFloor = true;
}
}
if(ceilEntry != null){
Interval ceilInterval = ceilEntry.getValue();
if(ceilInterval.start <= val+1){
ceilInterval.start = Math.min(ceilInterval.start,val);
insertCeil = true;
}
}
if(!insertFloor && !insertCeil)
maps.put(val,new Interval(val,val));
else if(insertFloor && insertCeil){//移除Ceil
maps.remove(ceilEntry.getKey());
floorEntry.getValue().end = ceilEntry.getValue().end;
}
}
public List<Interval> getIntervals() {
Collection<Interval> values = maps.values();
List<Interval> list = new LinkedList<>();
for(Interval tmp:values){
list.add(tmp);
}
return list;
}
}
/**
* Your SummaryRanges object will be instantiated and called as such:
* SummaryRanges obj = new SummaryRanges();
* obj.addNum(val);
* List<Interval> param_2 = obj.getIntervals();
*/
代码2(引用)
public class SummaryRanges {
/** Initialize your data structure here. */
private TreeSet<Interval> intervalSet;
public SummaryRanges() {
intervalSet = new TreeSet<Interval>(new Comparator<Interval>() {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
});
}
public void addNum(int val) {
Interval valInterval = new Interval(val, val);
Interval floor = intervalSet.floor(valInterval);
if (floor != null) {
if (floor.end >= val) {
return;
} else if (floor.end + 1 == val) {
valInterval.start = floor.start;
intervalSet.remove(floor);
}
}
Interval higher = intervalSet.higher(valInterval);
if (higher != null && higher.start == val + 1) {
valInterval.end = higher.end;
intervalSet.remove(higher);
}
intervalSet.add(valInterval);
}
public List<Interval> getIntervals() {
return Arrays.asList(intervalSet.toArray(new Interval[0]));
}
}