zoukankan      html  css  js  c++  java
  • LeetCode57 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]. (Hard)

    分析:

    首先可以采用merge interval的方法,先把区间填进去,然后排序,最后再调用merge,复杂度O(NlogN)

    代码:

     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 private:
    12     static bool cmp (const Interval& I1, const Interval& I2) {
    13         return I1.start < I2.start;
    14     }
    15     vector<Interval> merge(vector<Interval>& intervals) {
    16         vector<Interval> result;
    17         if (intervals.size() == 0) {
    18             return result;
    19         }
    20         sort(intervals.begin(), intervals.end(), cmp);
    21         int left = intervals[0].start, right = intervals[0].end;
    22         for (int i = 1; i < intervals.size(); ++i) {
    23             if (intervals[i].start <= right) {
    24                 right = max(right,intervals[i].end);
    25             }
    26             else {
    27                 result.push_back(Interval(left,right));
    28                 left = intervals[i].start;
    29                 right = intervals[i].end;
    30             }
    31         }
    32         result.push_back(Interval(left,right));
    33         return result;
    34     }
    35 public:
    36     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
    37         vector<Interval> result;
    38         intervals.push_back(newInterval);
    39         sort(intervals.begin(),intervals.end(),cmp);
    40         result = merge(intervals);
    41         return result;
    42     }
    43 };

    当然还有O(N)的算法可以优化。

    分三步来做:

    第一步,找到左侧不跟newInterval相交的区间添加到结果中;

    第二步,找到所有和newInterval相交的区间并找到其左边界和右边界,然后建立新的interval添加到结果中;

    第三部,找到右侧不跟newInterval相交的区间添加到结果中。

    注意很多细节在里面可能会犯错

    代码:

     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> result;
    14         if (intervals.size() == 0) {
    15             result.push_back(newInterval);
    16             return result;
    17         }
    18         int i = 0;
    19         while (i < intervals.size() && intervals[i].end < newInterval.start) {
    20             result.push_back(intervals[i++]);
    21         }
    22         int left = 0;
    23         if (i == intervals.size()) {  
    24             left = newInterval.start;                   
    25         }
    26         else {
    27             left = min(newInterval.start,intervals[i].start);
    28         }
    29         while (i < intervals.size() && intervals[i].start <= newInterval.end) {
    30             i++;
    31         }
    32         int right = 0;
    33         if (i >= 1) {
    34             right = max(newInterval.end, intervals[i - 1].end);
    35         }
    36         else {
    37             right = newInterval.end;
    38         }
    39         result.push_back(Interval(left,right));
    40         while (i < intervals.size() ) {
    41             result.push_back(intervals[i++]);
    42         }
    43         return result;
    44     }
    45 };
     
  • 相关阅读:
    结对
    汉堡 结对2.0
    《构建之法》第四章读后感
    复利计算单元测试
    实验一 命令解释程序的编写
    《构建之法》读后感
    复利计算 2.0
    了解和熟悉操作系统
    学习进度条
    perl的贪婪和非贪婪模式
  • 原文地址:https://www.cnblogs.com/wangxiaobao/p/5823971.html
Copyright © 2011-2022 走看看