题目:
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]
.
其实这题跟之前对区间的合并非常相似,可以当作先给整体区间进行元素的添加,然后再进行区间的合并。
Java版本:
/**
* 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; }
* }
*/
class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
int n = intervals.size() + 1;
int[] starts = new int[n];
int[] ends = new int[n];
intervals.add(newInterval);
for(int i = 0; i < n; i++){
starts[i] = intervals.get(i).start;
ends[i] = intervals.get(i).end;
}
Arrays.sort(starts);
Arrays.sort(ends);
List<Interval> res = new ArrayList<Interval>();
for( int i=0, j = 0; i < n; i++){
if( i == n - 1 || starts[i+1] > ends[i] ){
res.add(new Interval(starts[j], ends[i]));
j = i + 1;
}
}
return res;
}
}
# Definition for an interval.
# class Interval:
# def __init__(self, s=0, e=0):
# self.start = s
# self.end = e
class Solution:
def insert(self, intervals, newInterval):
"""
:type intervals: List[Interval]
:type newInterval: Interval
:rtype: List[Interval]
"""
if len(intervals) == 0 : return [];
intervals.append(newInterval);
intervals = sorted(intervals, key = lambda x : x.start)
res = [intervals[0]]
for n in intervals[1:] :
if n.start <= res[-1].end : res[-1].end = max(n.end,res[-1].end)
else: res.append(n)
return res;
C++版本:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
auto compare = [] (const Interval &intv1, const Interval &intv2)
{ return intv1.end < intv2.start; };
auto range = equal_range(intervals.begin(), intervals.end(), newInterval, compare);
auto itr1 = range.first, itr2 = range.second;
if (itr1 == itr2) {
intervals.insert(itr1, newInterval);
} else {
itr2--;
itr2->start = min(newInterval.start, itr1->start);
itr2->end = max(newInterval.end, itr2->end);
intervals.erase(itr1, itr2);
}
return intervals;
}
};