_莫相逢

导航

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 };

 

posted on 2019-04-13 18:09  莫晓风  阅读(115)  评论(0编辑  收藏  举报