1
1
/*
2
- Author: Annie Kim, [email protected]
2
+
3
3
Date: Jun 7, 2013
4
+ Update: Dec 14, 2014
4
5
Problem: Insert Interval
5
6
Difficulty: Medium
6
- Source: http ://leetcode.com/onlinejudge#question_57
7
+ Source: https ://oj. leetcode.com/problems/insert-interval/
7
8
Notes:
8
9
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
9
10
You may assume that the intervals were initially sorted according to their start times.
19
20
3. merge [6,7] with [3,9], get newInterval = [3,9];
20
21
4. merge [8,10] with [3,9], get newInterval = [3,10];
21
22
5. compare [12,16] with [3,10], insert newInterval [3,10], then all the remaining intervals...
23
+ Solution 1 : Time O(N).
24
+ Solution 2 : Time O(Log(N)).
22
25
*/
23
26
24
27
/* *
32
35
*/
33
36
class Solution {
34
37
public:
35
- vector<Interval> insert (vector<Interval> &intervals, Interval newInterval) {
38
+ vector<Interval> insert_1 (vector<Interval> &intervals, Interval newInterval) {
36
39
vector<Interval> res;
37
40
vector<Interval>::iterator it = intervals.begin ();
38
41
bool inserted = false ;
39
42
for (; it != intervals.end (); ++it)
40
43
{
41
- if (inserted || it->end < newInterval.start ) // non-overlaping
44
+ if (inserted == true || it->end < newInterval.start ) // non-overlaping
42
45
{
43
46
res.push_back (*it);
44
47
}
@@ -54,8 +57,42 @@ class Solution {
54
57
newInterval.end = max (it->end , newInterval.end );
55
58
}
56
59
}
57
- if (! inserted)
60
+ if (inserted == false )
58
61
res.push_back (newInterval);
59
62
return res;
60
63
}
64
+ vector<Interval> insert_2 (vector<Interval> &intervals, Interval newInterval) {
65
+ vector<Interval> res;
66
+ int n = intervals.size ();
67
+ int left = 0 , right = n-1 ;
68
+ while (left<=right){
69
+ int mid = (left+right)/2 ;
70
+ if (intervals[mid].start >newInterval.start ) right=mid-1 ;
71
+ else left = mid+1 ;
72
+ }
73
+ int idxStart = right;
74
+ left = 0 ; right = n-1 ;
75
+ while (left<=right){
76
+ int mid = (left+right)/2 ;
77
+ if (intervals[mid].end >=newInterval.end ) right = mid -1 ;
78
+ else left = mid+1 ;
79
+ }
80
+ int idxEnd = left;
81
+
82
+ if (idxStart>=0 && newInterval.start <=intervals[idxStart].end )
83
+ {
84
+ newInterval.start =intervals[idxStart--].start ;
85
+ }
86
+
87
+ if (idxEnd<intervals.size () && newInterval.end >=intervals[idxEnd].start )
88
+ {
89
+ newInterval.end =intervals[idxEnd++].end ;
90
+ }
91
+ for (int i=0 ;i<=idxStart;i++)
92
+ res.push_back (intervals[i]);
93
+ res.push_back (newInterval);
94
+ for (int i=idxEnd;i<intervals.size ();i++)
95
+ res.push_back (intervals[i]);
96
+ return res;
97
+ }
61
98
};
0 commit comments