No.57 Insert Interval

No.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].

思路不清晰,参考书和博客。

改进之处:方法没变,但由于insert和erase函数代价有点高,会移动修改,故,不做原地的,空间换时间,直接新建一个好了。

法一:从前向后遍历,依次比较进行插入【leetcode超时,被嫌弃了!】

 1 #include "stdafx.h"
 2 #include <vector>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct Interval
 8 {
 9     int start;
10     int end;
11     Interval():start(0),end(0) {}
12     Interval(int s, int e):start(s),end(e) {}
13 };
14 class Solution
15 {
16 public:
17     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)
18     {//参考:书
19      //从前向后比较,看是否插入
20         auto it = intervals.begin();
21         while(it != intervals.end())
22         {
23             if(newInterval.end < it->start)
24             {//当前区间在待插入区间之前,直接插入待插入区间
25                 intervals.insert(it, newInterval);
26                 return intervals;
27             }
28             else if(newInterval.start > it->end)
29             {//当前区间大于待插入区间,跳过,继续判断
30                 it++;
31                 continue;
32             }
33             else
34             {//当前区间与待插入区间之间有重合部分
35                 newInterval.start = min(newInterval.start,it->start);
36                 newInterval.end = max(newInterval.end,it->end);
37                 it = intervals.erase(it);//返回删除位置的下一个位置
38             }
39         }
40         intervals.insert(intervals.end(),newInterval);//防止待插入区间在最后
41         return intervals;
42     }
43 };
44 int main()
45 {
46     Solution sol;
47 
48     Interval data1[] = {Interval(1,3),Interval(6,9)};
49     vector<Interval> test1(data1,data1+2);
50 //test1:Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
51     for(auto &i : test1)
52         cout << "["<<i.start << ","<< i.end<<"]";
53     cout << endl;
54     sol.insert(test1,Interval(2,5));
55     for(auto &i : test1)
56         cout << "["<<i.start << ","<< i.end<<"]";
57     cout << endl;
58     cout << endl;
59 
60     Interval data2[] = {Interval(1,2),Interval(3,5),Interval(6,7),Interval(8,10),Interval(12,16)};
61     vector<Interval> test2(data2,data2+5);
62 //test2:Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
63     for(auto &i : test2)
64         cout << "["<<i.start << ","<< i.end<<"]";
65     cout << endl;
66     sol.insert(test2,Interval(4,9));
67     for(auto &i : test2)
68         cout << "["<<i.start << ","<< i.end<<"]";
69     cout << endl;
70 
71     return 0;
72 }

 

法二:空间换时间,不做原地操作,将结果存到新的vector中

 1 class Solution
 2 {
 3 public:
 4     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)
 5     {//参考:书
 6      //从前向后比较,看是否插入
 7      //改进之处:方法没变,但由于insert和erase函数代价有点高,会移动修改,故,不做原地的,空间换时间,直接新建一个好了。
 8         vector<Interval> res;
 9         int count = intervals.size();
10         if(count == 0)
11         {
12             res.push_back(newInterval);//防止待插入区间在最后
13             return res;
14         }
15 
16         int index = 0;
17         while(index<count)
18         {
19             if(newInterval.end < intervals[index].start)
20             {//当前区间在待插入区间之前,直接插入待插入区间
21                 res.push_back(newInterval);
22                 while(index<count)
23                 {
24                     res.push_back(intervals[index]);//剩余元素插入res
25                     index++;
26                 }
27                 return res;
28             }
29             else if(newInterval.start > intervals[index].end)
30             {//当前区间大于待插入区间,跳过,继续判断
31                 res.push_back(intervals[index]);
32             }
33             else
34             {//当前区间与待插入区间之间有重合部分
35                 newInterval.start = min(newInterval.start,intervals[index].start);
36                 newInterval.end = max(newInterval.end,intervals[index].end);
37             }
38             index++;
39         }
40         res.push_back(newInterval);//防止待插入区间在最后
41         return res;
42     }
43 };

 

 参考:http://www.cnblogs.com/ganganloveu/p/4158450.html

 

转载于:https://www.cnblogs.com/dreamrun/p/4562784.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值