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 };
其他参考:
1 https://blog.csdn.net/ljq140421/article/details/77897487
2 https://blog.csdn.net/linglian0522/article/details/70194598