题目:Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
思路1:空间复杂度O(N)
用一个List<Interval>result存放最终结果。顺序读取intervals:
如果newEnd<curStart,则result.add(newInverval),然后把i以及后面的interval也add到result中,并返回;
如果newStart>curEnd,则把interval.get(i) add 到result中;
其他情况(interval和newInterval有重叠),更新newInverval的Start和End
代码1:(速度快)
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> result = new ArrayList<Interval>();
for(int i=0;i<intervals.size();i++){
int newStart = newInterval.start;
int newEnd = newInterval.end;
Interval curInterval = intervals.get(i);
int curStart = curInterval.start;
int curEnd = curInterval.end;
if(newEnd<curStart){
result.add(newInterval);
for(int j=i;j<intervals.size();j++)
result.add(intervals.get(j));
return result;
}else if(newStart>curEnd){
result.add(curInterval);
}
else{
newInterval.start=Math.min(curStart, newStart);
newInterval.end=Math.max(curEnd, newEnd);
}
}
result.add(newInterval);
return result;
}
思路2:空间复杂度O(1) 不需要一个result List
顺序读取intervals。
如果newInterval在intervals.get(i)前面,则intervals.add(newInterval), return intervals;
如果newInterval在intervals.get(i)后面,continue;
如果两者有重叠,更新newInterval的start和end,从intervals中删除intervals.remove(i)。这是得注意i下标,得i--
代码2:虽然空间复杂度低了,但是runtime长了
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
for(int i=0;i<intervals.size();i++){
int newStart = newInterval.start;
int newEnd = newInterval.end;
if(newEnd<intervals.get(i).start)
{
intervals.add(i,newInterval);
return intervals;
}else if(newStart>intervals.get(i).end){
continue;
}else{
newInterval.start=Math.min(newStart,intervals.get(i).start);
newInterval.end=Math.max(newEnd, intervals.get(i).end);
intervals.remove(i);
i--;
}
}
intervals.add(newInterval);
return intervals;
<span style="white-space:pre"> </span>}