leetcode57——Insert Interval

题目大意:在按照区间起点值升序排列的区间数组中插入一个新的区间,如果新区间和原区间有重叠,则合并重叠区间

分析:排序的考察。可以和leetcode56一样做,将新区间插入数组之后排序,然后调用56里面的函数即可。另一种方法可以不用O(nlogn)的时间复杂度,而是在O(N)内就完成插入。方法分三步走:1.将区间终点值<新区间起点值的区间直接放入答案 2.在新区间和与新区间有重叠的老区间中找到left和right范围压入答案 3.将剩余的老区间起点值>新区间终点值的老区间放入答案

代码:转载自http://www.cnblogs.com/wangxiaobao/p/5823971.html

/**
* 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> result;
if (intervals.size() == 0) {
result.push_back(newInterval);
return result;
}
int i = 0;
while (i < intervals.size() && intervals[i].end < newInterval.start) {
result.push_back(intervals[i++]);
}  //完成第一步
int left = 0;
if (i == intervals.size()) {
left = newInterval.start;
}
else {
left = min(newInterval.start, intervals[i].start);
}
while (i < intervals.size() && intervals[i].start <= newInterval.end) {
i++;  //把和新区间有交集的老区间都跳过
}
int right = 0;
if (i >= 1) {
right = max(newInterval.end, intervals[i - 1].end);
}
else {
right = newInterval.end;
}
result.push_back(Interval(left, right));
while (i < intervals.size()) {
result.push_back(intervals[i++]);
}
return result;
}
};

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/80125891