-
Notifications
You must be signed in to change notification settings - Fork 215
/
merge_intervals.js
63 lines (51 loc) · 2.13 KB
/
merge_intervals.js
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
/*
Problem definition:
Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals,
and return an array of the non-overlapping intervals that cover all the intervals in the input.
Approach:
The approach is to first sort the intervals by their start times.
Then we initialize a new merged intervals array and loop through all the intervals.
For each interval, if the merged array is empty or
the current interval does not overlap with the previous interval,
then we add the current interval to the merged array.
Otherwise, we merge the current interval with the previous interval
by updating the end time of the previous interval to the maximum of
its original end time and the end time of the current interval.
Finally, we return the merged array.
Complexity:
The time complexity of this solution is O(n log n) due to the initial sorting step.
The space complexity is O(n) to store the merged intervals array.
Sample input/outputs:
Example 1:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Example 2:
Input: [[1,3],[2,6],[8,10],[9,12]]
Output: [[1,6],[8,12]]
Example 3:
Input: [[1,4],[0,4]]
Output: [[0,4]]
*/
function merge(intervals) {
// Sort the intervals by their start times
intervals.sort((a, b) => a[0] - b[0]);
// Initialize a new merged intervals array
const merged = [];
// Loop through all the intervals
for (let i = 0; i < intervals.length; i++) {
let interval = intervals[i];
// If the merged array is empty or the current interval does not overlap with the previous interval
// then add the current interval to the merged array
if (merged.length === 0 || interval[0] > merged[merged.length - 1][1]) {
merged.push(interval);
} else {
// Otherwise, merge the current interval with the previous interval
merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], interval[1]);
}
}
// Return the merged array
return merged;
}
// Example usage:
const intervals = [[1,3],[2,6],[8,10],[15,18]];
console.log(merge(intervals)); // [[1,6],[8,10],[15,18]]