[LeetCode] 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].

问题:给定一个区间数组,插入一个新的区间元素。区间数组已经按照 区间开始值升序排序。

思路:

1. 找到左边第一个 intervals[i].end >= newInterval.start 的元素。

2. 若 intervals[i].start > newInterval.end,则在 i 位置插入 newInterval ,程序结束。否则,将后续所有 intervals[j].start <= newInterval.end (i <= j)的元素合并到 i 位置,intervals[i].start 取涉及合并的最小值, intervals[i].end 取涉及合并的最大值。

3. 将 i 后面没有涉及合并的元素往前移动,移动至紧跟 i 元素。

这道题的思路不难也比较直观,时间效率为 O(n),只是需要处理的边界情况比较多。例如有首部插入区间数组、尾部插入区间数组、以及完全覆盖的区间数组情况。

 1 vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
 2     
 3     if (intervals.size() == 0) {
 4         intervals.push_back(newInterval);
 5         return intervals;
 6     }
 7     
 8     if (newInterval.end < intervals[0].start) {
 9         intervals.insert(intervals.begin(), newInterval);
10         return intervals;
11     }
12     
13     if (newInterval.start > intervals[intervals.size()-1].end) {
14         intervals.push_back(newInterval);
15         return intervals;
16     }
17     
18     if (newInterval.start <= intervals[0].start && intervals[intervals.size()-1].end <= newInterval.end) {
19         intervals.clear();
20         intervals.push_back(newInterval);
21         return intervals;
22     }
23     
24     
25     int len = (int)intervals.size();
26     int i = 0;
27     for ( ; i < intervals.size(); i++) {
28         if (intervals[i].end >= newInterval.start) {
29             break;
30         }
31     }
32     int theIdx = i;
33     
34     if (intervals[theIdx].start > newInterval.end) {
35         vector<Interval>::iterator nth = intervals.begin() + theIdx;
36         intervals.insert(nth, newInterval);
37         return intervals;
38     }else{
39         intervals[theIdx].start = min( intervals[theIdx].start, newInterval.start);
40 
41     }
42 
43     while (i < intervals.size() && intervals[i].start <= newInterval.end) {
44         intervals[theIdx].end = max(intervals[i].end, newInterval.end);
45         i++;
46     }
47         
48     int j = theIdx + 1;
49     
50     while (i < intervals.size()) {
51         intervals[j] = intervals[i];
52         i++;
53         j++;
54     }
55     
56     while (j < len) {
57         intervals.pop_back();
58         j++;
59     }
60     
61     return intervals;
62 }