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]
.
Analysis:
In other words, the questions gives a new interval, the task is to insert this new interval into an ordered non-overlapping intervals. Consider the merge case.
Idea to solve this problem is quite straight forward:
1. Insert the new interval according to the start value.
2. Scan the whole intervals, merge two intervals if necessary.
Can use code from previous question
Java
public class Solution {
class IntervalCompartor implements Comparator<Interval>{
@Override
public int compare(Interval o1, Interval o2) {
// TODO Auto-generated method stub
return o1.start-o2.start;
}
}
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> result = new ArrayList<>();
if(intervals.size()<=0){
result.add(newInterval);
return result;
}
int i=0;
for(;i<intervals.size();i++){
if(newInterval.start<intervals.get(i).start){
intervals.add(i, newInterval);
break;
}
}
if(i==intervals.size()) intervals.add(newInterval);
Collections.sort(intervals, new IntervalCompartor());
result.add(intervals.get(0));
for(i=1;i<intervals.size();i++){
Interval tem = result.get(result.size()-1);
if(tem.end>=intervals.get(i).start){
tem.end = Math.max(tem.end, intervals.get(i).end);
result.set(result.size()-1, tem);
}else {
result.add(intervals.get(i));
}
}
return result;
}
}
c++
class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval> result;
vector<Interval>::iterator it;
for(it = intervals.begin();it!=intervals.end();it++){
if(newInterval.start<(*it).start){
intervals.insert(it,newInterval);
break;
}
}
if(it == intervals.end())
intervals.insert(it,newInterval);
if(intervals.empty()) return result;
result.push_back(*intervals.begin());
for(it = intervals.begin()+1; it!=intervals.end();it++){
if(result.back().end>=(*it).start){
result.back().end = max(result.back().end,(*it).end);
}else{
result.push_back(*it);
}
}
return result;
}
};