• 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 };
  • 相关阅读:
    文件上传中的错误文件上传及其命名
    播放音乐
    文件的读取与写入ASP.NET中常用代码之四(转载)
    Spring中文在线文档
    Css 图形
    离职进行时
    又面试了
    在Spring应用中创建全局获取ApplicationContext对象
    开始研究WEKA,一个开源java的数据挖掘工具
    收到SZ科技的录取通知,纠结是不是要去
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10702245.html
Copyright © 2020-2023  润新知