Description
对于给定的一些不重合的有序的区间, 插入一个新区间,必要的时候和原有的区间合并。比如:
给定[1,3],[6,9], 插入[2,5],得到 [1,5],[6,9].
再比如:
给定[1,2],[3,5],[6,7],[8,10],[12,16],插入[4,9],得到 [1,2],[3,10],[12,16].
因为[4,9] 和 [3,5],[6,7],[8,10]重合
Possible Solution
时间复杂度O(N)
遍历一次原有的区间,一共可能有四种情况:
用()表示原有区间,用[]表示要插入的新区间
1. ()[]
2. []()
3. ([)]
4. [(])
对于第一种情况,只需要将()区间保留。
对于第二种情况,需要将[]和()区间都插入。
对于第三种情况,需要将要插入区间的左边界换成原有区间的左边界,即 由([)]变为[*)], *为原来[的位置。
对于第四种情况,需要将要插入区间的右边界换成原有区间的右边界,即 由[(])变为[(*], *为原来]的位置。
代码如下:
/**
* 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) {
vector<Interval>::iterator it;
vector<Interval> ans;
bool bol = false;
for (it = intervals.begin(); it != intervals.end(); ++it) {
if (it -> end < newInterval.start)
ans.push_back(*it);
else if (it -> start < newInterval.start)
newInterval.start = it -> start;
if (it -> start > newInterval.end) {
if (!bol) { ans.push_back(newInterval); bol = true;}
ans.push_back(*it);
}
else if (it -> end > newInterval.end)
newInterval.end = it -> end;
}
if (!bol) ans.push_back(newInterval);
return ans;
}
};