给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5] 输出: [[1,5],[6,9]]
示例 2:
输入: intervals =[[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval =[4,8]
输出: [[1,2],[3,10],[12,16]] 解释: 这是因为新的区间[4,8]
与[3,5],[6,7],[8,10]
重叠。
/** * 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.empty()) return {newInterval}; if(newInterval.end<intervals.begin()->start) { intervals.insert(intervals.begin(),newInterval); return intervals; } if(newInterval.start>intervals.back().end) { intervals.push_back(newInterval); return intervals; } auto iter = intervals.begin(); for (; iter != intervals.end(); ++iter) if (iter->end>= newInterval.start) break; auto start = iter; auto end = start; for (; end != intervals.end(); ++end) if (end->start>newInterval.end) break; int first = min(start->start,newInterval.start); int second =max( (end - 1)->end, newInterval.end); auto begin = start - intervals.begin(); intervals.erase(start, end); intervals.insert(intervals.begin()+begin, { first,second }); return intervals; } vector<Interval> insert1(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);//找到i1.end>=new.start i2.end>new.start 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; } };