给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
分析
这题是容易题,但写起来感觉有点麻烦
找出新区间插入后头尾所在的位置,头尾之间的合并
头尾可能在原区间之中或在原区间之外
/**
* Definition of Interval:
* class Interval {
* public:
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
* }
*/
class Solution {
public:
/**
* Insert newInterval into intervals.
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
// write your code here
vector<int> buf;
int beginIndex = -1;
int endIndex = -1;
int begin = newInterval.start;
int end = newInterval.end;
for(int i = 0; i < intervals.size(); ++i) {
Interval cur = intervals[i];
if(beginIndex == -1) {
if(begin < cur.start) {
buf.push_back(begin);
beginIndex = buf.size() - 1;
--i;
}else if(begin >= cur.start && begin <= cur.end) {
buf.push_back(cur.start);
beginIndex = buf.size() - 1;
--i;
}else {
buf.push_back(intervals[i].start);
buf.push_back(intervals[i].end);
}
}else if(endIndex == -1) {
if(end < cur.start) {
buf.push_back(end);
endIndex = buf.size() - 1;
--i;
}else if(end >= cur.start && end <= cur.end) {
buf.push_back(cur.end);
endIndex = buf.size() - 1;
}
}else {
buf.push_back(intervals[i].start);
buf.push_back(intervals[i].end);
}
}
if(beginIndex == -1) {
buf.push_back(begin);
}
if(endIndex == -1) {
buf.push_back(end);
}
vector<Interval> r;
for(int i = 0; i < buf.size(); i += 2) {
r.push_back(Interval(buf[i], buf[i + 1]));
}
return r;
}
};