30 插入区间

原题网址:http://www.lintcode.com/zh-cn/problem/insert-interval/#

给出一个无重叠的按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

样例

插入区间(2, 5) 到 [(1,2), (5,9)],我们得到 [(1,9)]

插入区间(3, 4) 到 [(1,2), (5,9)],我们得到 [(1,2), (3,4), (5,9)]

 

参考:

https://blog.csdn.net/gao1440156051/article/details/51606213

https://blog.csdn.net/linhuanmars/article/details/22238433

基本思路就是先扫描走到新的interval应该插入的位置,接下来就是插入新的interval并检查后面是否冲突,有冲突就合并区间,一直到新的interval的end小于下一个interval的start,然后取新interval和当前interval中end大的即可。因为要进行一次线性扫描,所以时间复杂度是O(n)。而空间上如果我们重新创建一个ArrayList返回,那么就是O(n)。

 1 /**
 2  * Definition of Interval:
 3  * classs Interval {
 4  *     int start, end;
 5  *     Interval(int start, int end) {
 6  *         this->start = start;
 7  *         this->end = end;
 8  *     }
 9  * }
10  */
11 
12 class Solution {
13 public:
14     /**
15      * @param intervals: Sorted interval list.
16      * @param newInterval: new interval.
17      * @return: A new interval list.
18      */
19     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
20         // write your code here
21         if (intervals.empty())
22     {
23         intervals.push_back(newInterval);
24         return intervals;
25     }
26     vector<Interval> result;
27     int size=intervals.size();
28     int i=0;
29     for (;i<size;i++)
30     {
31         if (newInterval.start>intervals[i].end)
32         {
33             result.push_back(intervals[i]);
34         }
35         else
36         {
37             break;
38         }
39     }
40 
41     if (i<size)
42     {
43         newInterval.start=min(newInterval.start,intervals[i].start);
44     }
45 
46     for (;i<size;i++)
47     {
48         if (newInterval.end>=intervals[i].start)
49         {
50             newInterval.end=max(newInterval.end,intervals[i].end);
51         }
52         else
53         {
54             break;
55         }
56     }
57 
58     result.push_back(newInterval);
59     for (;i<size;i++)
60     {
61         result.push_back(intervals[i]);
62     }
63 
64     return result;
65     }
66 };

其他参考:

https://blog.csdn.net/ljq140421/article/details/77897487

https://blog.csdn.net/linglian0522/article/details/70194598

posted @ 2018-04-03 09:14  eeeeeeee鹅  阅读(173)  评论(0编辑  收藏  举报