leetcode-57. Insert Interval
题目:
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].
这题和56题类似,但是这题讨论起来比较麻烦。如果能不依靠test一遍写出来也是很厉害了。
首先这题整体上思路是这样的: 先考虑插入问题,在考虑融合问题。说起来比较简单但是做起来比较麻烦。
首先插入除了需要考虑正常的中间某个i坐标插入以外还需要考虑,空集的情况以及在末尾插入的情况。在插入后还需要保留当前插入的坐标,以减少时间复杂度
其次融合问题。需要考虑两个方向上的融合,而且先向后融合然后向前融合比较方便。融合的生活还需注意一点是有时候会出现既要向后融合又要向前融合的情况,所以每次融合start和end都需要更新,不能向后融合只更新end,向前融合只更新start。我就犯了这样的错误,而且如果没有test我估计我是找不出啦的。
虽然思路不难,但是从思维的严密性来说这题也确实算是难题了。
/**
* 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; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if(intervals.size()==0){
intervals.add(newInterval);
return intervals;
}
int p = 0;
while(p<intervals.size()){
if(intervals.get(p).end>=newInterval.end){
intervals.add(p,newInterval);
break;
}
p++;
if(p==intervals.size()){
intervals.add(newInterval);
break;
}
}
int q = p;
while(p<intervals.size()-1){
if(intervals.get(p).end>=intervals.get(p+1).start){
intervals.get(p).end=Math.max(intervals.get(p).end,intervals.get(p+1).end);
intervals.get(p).start=Math.min(intervals.get(p).start,intervals.get(p+1).start);
intervals.remove(p+1);
}else{
break;
}
}
while(p>0 ){
if(intervals.get(p).start<=intervals.get(p-1).end){
intervals.get(p).start=Math.min(intervals.get(p-1).start,intervals.get(p).start);
intervals.get(p).end=Math.max(intervals.get(p-1).end,intervals.get(p).end);
intervals.remove(p-1);
p--;
}else{
break;
}
}
return intervals;
}
}