zoukankan      html  css  js  c++  java
  • [LeetCode] 57. Insert Interval 解决思路

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

    You may assume that the intervals were initially sorted according to their start times.

    Example 1:
    Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

    Example 2:
    Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

    This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

    问题:给定一个区间数组,插入一个新的区间元素。区间数组已经按照 区间开始值升序排序。

    思路:

    1. 找到左边第一个 intervals[i].end >= newInterval.start 的元素。

    2. 若 intervals[i].start > newInterval.end,则在 i 位置插入 newInterval ,程序结束。否则,将后续所有 intervals[j].start <= newInterval.end (i <= j)的元素合并到 i 位置,intervals[i].start 取涉及合并的最小值, intervals[i].end 取涉及合并的最大值。

    3. 将 i 后面没有涉及合并的元素往前移动,移动至紧跟 i 元素。

    这道题的思路不难也比较直观,时间效率为 O(n),只是需要处理的边界情况比较多。例如有首部插入区间数组、尾部插入区间数组、以及完全覆盖的区间数组情况。

     1 vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
     2     
     3     if (intervals.size() == 0) {
     4         intervals.push_back(newInterval);
     5         return intervals;
     6     }
     7     
     8     if (newInterval.end < intervals[0].start) {
     9         intervals.insert(intervals.begin(), newInterval);
    10         return intervals;
    11     }
    12     
    13     if (newInterval.start > intervals[intervals.size()-1].end) {
    14         intervals.push_back(newInterval);
    15         return intervals;
    16     }
    17     
    18     if (newInterval.start <= intervals[0].start && intervals[intervals.size()-1].end <= newInterval.end) {
    19         intervals.clear();
    20         intervals.push_back(newInterval);
    21         return intervals;
    22     }
    23     
    24     
    25     int len = (int)intervals.size();
    26     int i = 0;
    27     for ( ; i < intervals.size(); i++) {
    28         if (intervals[i].end >= newInterval.start) {
    29             break;
    30         }
    31     }
    32     int theIdx = i;
    33     
    34     if (intervals[theIdx].start > newInterval.end) {
    35         vector<Interval>::iterator nth = intervals.begin() + theIdx;
    36         intervals.insert(nth, newInterval);
    37         return intervals;
    38     }else{
    39         intervals[theIdx].start = min( intervals[theIdx].start, newInterval.start);
    40 
    41     }
    42 
    43     while (i < intervals.size() && intervals[i].start <= newInterval.end) {
    44         intervals[theIdx].end = max(intervals[i].end, newInterval.end);
    45         i++;
    46     }
    47         
    48     int j = theIdx + 1;
    49     
    50     while (i < intervals.size()) {
    51         intervals[j] = intervals[i];
    52         i++;
    53         j++;
    54     }
    55     
    56     while (j < len) {
    57         intervals.pop_back();
    58         j++;
    59     }
    60     
    61     return intervals;
    62 }
  • 相关阅读:
    详解MySQL中EXPLAIN解释命令(转)
    yii framework config 可以被配置的项目
    YII之yiic创建YII应用
    Yii 用户登录验证
    全选,反选,获取值ajax提交
    firefox常用插件
    file_get_contents failed to open stream: HTTP request failed(一个字符决定成败)
    linux svn服务器(一)
    js操作cookie(转载:经测试可用)
    淘宝用户api 如何获得App Key和API Secret
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5087009.html
Copyright © 2011-2022 走看看