-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinsert-interval.cpp
121 lines (105 loc) · 3.36 KB
/
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// https://leetcode.com/problems/insert-interval/
// Linear Search
class Solution
{
public:
// Returns true if the intervals a and b have a common element.
bool doesIntervalsOverlap(vector<int> &a, vector<int> &b)
{
return min(a[1], b[1]) - max(a[0], b[0]) >= 0;
}
// Return the interval having all the elements of intervals a and b.
vector<int> mergeIntervals(vector<int> &a, vector<int> &b)
{
return {min(a[0], b[0]), max(a[1], b[1])};
}
// Insert the interval newInterval, into the list interval keeping the sorting order intact.
void insertInterval(vector<vector<int>> &intervals, vector<int> &newInterval)
{
bool isIntervalInserted = false;
for (int i = 0; i < intervals.size(); i++)
{
if (newInterval[0] < intervals[i][0])
{
// Found the position, insert the interval and break from the loop.
intervals.insert(intervals.begin() + i, newInterval);
isIntervalInserted = true;
break;
}
}
// If there is no interval with a greater value of start value,
// then the interval must be inserted at the end of the list.
if (!isIntervalInserted)
{
intervals.push_back(newInterval);
}
}
vector<vector<int>> insert(vector<vector<int>> &intervals, vector<int> &newInterval)
{
// Insert the interval first before merge processing.
insertInterval(intervals, newInterval);
vector<vector<int>> answer;
for (int i = 0; i < intervals.size(); i++)
{
vector<int> currInterval = {intervals[i][0], intervals[i][1]};
// Merge until the list gets exhausted or no overlap is found.
while (i < intervals.size() && doesIntervalsOverlap(currInterval, intervals[i]))
{
currInterval = mergeIntervals(currInterval, intervals[i]);
i++;
}
// Decrement to ensure we don't skip the interval due to outer for-loop incrementing.
i--;
answer.push_back(currInterval);
}
return answer;
}
};
// Binary Search
class Solution
{
public:
// Returns true if the intervals a and b have a common element.
bool doesIntervalsOverlap(vector<int> &a, vector<int> &b)
{
return min(a[1], b[1]) - max(a[0], b[0]) >= 0;
}
// Return the interval having all the elements of intervals a and b.
vector<int> mergeIntervals(vector<int> &a, vector<int> &b)
{
return {min(a[0], b[0]), max(a[1], b[1])};
}
// Insert the interval newInterval, into the list interval keeping the sorting order intact.
void insertInterval(vector<vector<int>> &intervals, vector<int> &newInterval)
{
int index = upper_bound(intervals.begin(), intervals.end(), newInterval) - intervals.begin();
if (index != intervals.size())
{
intervals.insert(intervals.begin() + index, newInterval);
}
else
{
intervals.push_back(newInterval);
}
}
vector<vector<int>> insert(vector<vector<int>> &intervals, vector<int> &newInterval)
{
// Insert the interval first before merge processing.
insertInterval(intervals, newInterval);
vector<vector<int>> answer;
for (int i = 0; i < intervals.size(); i++)
{
vector<int> currInterval = {intervals[i][0], intervals[i][1]};
// Merge until the list gets exhausted or no overlap is found.
while (i < intervals.size() && doesIntervalsOverlap(currInterval, intervals[i]))
{
currInterval = mergeIntervals(currInterval, intervals[i]);
i++;
}
// Decrement to ensure we don't skip the interval due to outer for-loop incrementing.
i--;
answer.push_back(currInterval);
}
return answer;
}
};