LeetCode 57 插入区间
题目:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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]
重叠。
解题思路:
对于这个示例 [ [1,3], [6,9] ] ,插入的区间可分为以下几种:
1、插入区间的end小于示例第一个区间的start,如:[-1,0] ,此时应该把这个newInterval插入,然后把剩余的示例区间依次插入即可
2、插入区间在给定的两个区间的间隔处,如 [4,5]
3、插入区间有重叠,如 [2,7]
4、插入区间在给定区间的最后一个位置插入,如 [10,11]
针对1、2、3中情况容易处理,主要是第3种情况。为解决第3种情况,我们想到用双指针来记录重叠的起始位置。如设置left和right,left为开始重叠的start较小者,right为最后一个重叠的end较大者。在第3种情况中(还是以 [2,7] 为例),开始重叠时为 [1,3] , 比较1和2,则取left为1;最后一个重叠时为 [6,9] , 比较9和7, 则取right = 9 。
代码:
1 /** 2 * Definition for an interval. 3 * struct Interval { 4 * int start; 5 * int end; 6 * Interval() : start(0), end(0) {} 7 * Interval(int s, int e) : start(s), end(e) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { 13 vector<Interval> ans; 14 if(intervals.empty()) { 15 ans.push_back(newInterval); 16 return ans; 17 } 18 Interval temp; 19 int left,right; 20 int lflag = 0; 21 int insertOk = 0; 22 int len = intervals.size(); 23 for(int i = 0; i < len; ++i) { 24 if(i == 0 && newInterval.end < intervals[i].start){ //如果newInterval在intervals的第一个之前 25 insertOk = 1; 26 ans.push_back(newInterval); 27 } 28 if(insertOk) { //已经插入,把intervals的后序逐个插入 29 ans.push_back(intervals[i]); 30 continue; 31 } 32 if(newInterval.start > intervals[i].end){ 33 ans.push_back(intervals[i]); 34 if(i == len - 1 || newInterval.end < intervals[i+1].start) { //判断是否是最后一个或者下一个不重叠 35 ans.push_back(newInterval); 36 insertOk = 1; 37 } 38 } 39 else { 40 if(newInterval.start >= intervals[i].start && newInterval.end <= intervals[i].end) { //当前intervals包含了newInterval 41 ans.push_back(intervals[i]); 42 insertOk = 1; 43 } 44 else { 45 if(!lflag) { //没有包含,则记录左边界 46 lflag = 1; 47 left = min(newInterval.start, intervals[i].start); 48 } 49 if(newInterval.end <= intervals[i].end ) { 50 right = intervals[i].end; //注意这里是和下面right取值不同之处 51 temp.start = left; 52 temp.end = right; 53 ans.push_back(temp); 54 insertOk = 1; 55 } 56 else { 57 if(i == len - 1 || newInterval.end < intervals[i+1].start) { 58 right = newInterval.end; 59 temp.start = left; 60 temp.end = right; 61 ans.push_back(temp); 62 insertOk = 1; 63 } 64 65 } 66 } 67 } 68 } 69 return ans; 70 } 71 };