-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy path57. Insert Interval.cpp
68 lines (65 loc) · 1.97 KB
/
57. Insert Interval.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*Insert Interval:Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).*/
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
auto itr = intervals.begin();
for (; itr != intervals.end() && newInterval.end >= itr->start; itr++)
{
if (canMerge(*itr, newInterval))
{
*itr = merge(*itr, newInterval);
// 检查后面的区间是否可以合并进来。
auto itr2 = itr + 1;
for (; itr2 != intervals.end(); itr2++)
{
if (canMerge(*itr, *itr2))
{
*itr = merge(*itr, *itr2);
}
else
{
break;
}
}
intervals.erase(itr + 1, itr2);
return intervals;
}
}
// 如果newInterval不能跟任何一个已有的区间合并,那就把它插入数组的合适位置。
// 所谓合适的位置,就是插入第一个比它的start大的区间前面。
intervals.insert(itr, newInterval);
return intervals;
}
private:
bool canMerge(const Interval &i1, const Interval &i2)
{
if (i1.start <= i2.start)
{
return i2.start <= i1.end;
}
else
{
return canMerge(i2, i1);
}
}
Interval merge(const Interval &i1, const Interval &i2)
{
if (i1.start <= i2.start)
{
return Interval(i1.start, max(i1.end, i2.end));
}
else
{
return merge(i2, i1);
}
}
};