这道题刚开始有点难想清楚,所以,代码上可能就会比较麻烦,但是一旦想清楚了,就会简单很多。个人感觉难度不算太大。
题目大体意思:给定一组互不相交的升序区间,再给定一个需要加入该组的区间,求出最终的包含的区间范围,要求如何新加入的区间与原有区间之间出现了重叠,就将其合并,从而得到最终结果。比如:原本的区间是包含:[1, 5],[6, 7] 给定的新区间[2,6],则最终的结果应该是[1, 7];
思路描述:
<1>、因为原本的区间组是升序排列的,因此,先将我们的新区间和原数组的起始点比较大小,插入原区间组中,保证各个区间的起始点是呈现有序的,此时,比如继续使用上面的例子,就得到了 [1, 5],[2, 6],[6, 7] 这样一个组合。
<2>、而后我们开始遍历整个数组,对可以合并的区间进行合并,这块代码有多种实现方式,大家可以自行设计,这里我参考了大神的代码,做了一下操作,具体看代码,思路是,先找到一个区间的起始点和终止点,而后来对比下一个区间,如何发现下一个区间与该区间能融合,就将终止点变为下一个区间的终止点,起始点不变,直到出现区间不重合的时候,将目前求出的起点和终点组成的新区间放入结果中,比如继续上面的例子,第一步,起点start = 1, 终点end = 5,到达第二块区间,发现可以融合,则start不变,end变为6,到达第三个区间,发现还能融合,end变为7,最终合成区间start=1,end=7。
AC代码如下所示:
/**
* 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) {
if (intervals.size() < 1) {
return vector<Interval> (1, newInterval);
}
int i=0;
for (i=0; i<intervals.size(); ++i) {
if (newInterval.start < intervals[i].start) {
break;
}
}
intervals.insert(intervals.begin()+i, newInterval);
vector<Interval> res;
int starts = intervals[0].start, ends = intervals[0].end;
for (i=1; i<intervals.size(); ++i) {
if (intervals[i].start <= ends) {
ends = max(ends, intervals[i].end);
} else {
res.emplace_back(Interval(starts, ends));
starts = intervals[i].start;
ends = intervals[i].end;
}
}
res.emplace_back(starts, ends);
return res;
}
};