首页 > 代码库 > LeetCode57 Insert Interval

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

 

 

LeetCode57 Insert Interval