1
+ package com .leetcode .arrays ;
2
+
3
+ import java .util .Arrays ;
4
+ import java .util .Comparator ;
5
+
6
+ /**
7
+ * Level: Medium
8
+ * Problem Link: https://leetcode.com/problems/merge-intervals/
9
+ * Problem Description:
10
+ * <p>
11
+ * Given a collection of intervals, merge all overlapping intervals.
12
+ * <p>
13
+ * Example 1:
14
+ * Input: [[1,3],[2,6],[8,10],[15,18]]
15
+ * Output: [[1,6],[8,10],[15,18]]
16
+ * Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
17
+ * <p>
18
+ * Example 2:
19
+ * Input: [[1,4],[4,5]]
20
+ * Output: [[1,5]]
21
+ * Explanation: Intervals [1,4] and [4,5] are considered overlapping.
22
+ *
23
+ * @author rampatra
24
+ * @since 2019-07-22
25
+ */
26
+ public class MergeIntervals {
27
+
28
+ /**
29
+ * Time complexity: O(n log n)
30
+ * Space complexity: O(n)
31
+ * Runtime: <a href="https://leetcode.com/submissions/detail/245385574/">6 ms</a>
32
+ *
33
+ * @param intervals a list of intervals, may not be sorted
34
+ * @return a list of intervals, with overlapping intervals merged
35
+ */
36
+ public static int [][] merge (int [][] intervals ) {
37
+ // some validations
38
+ if (intervals .length == 0 ) return new int [0 ][2 ];
39
+
40
+ // we first sort the intervals based on their start times
41
+ Arrays .sort (intervals , new IntervalComparator ());
42
+
43
+ int [][] mergedIntervals = new int [intervals .length ][2 ];
44
+ int lastMergedIndex = 0 ;
45
+ mergedIntervals [lastMergedIndex ] = intervals [0 ];
46
+
47
+ for (int i = 1 ; i < intervals .length ; i ++) {
48
+ if (isOverlap (mergedIntervals [lastMergedIndex ], intervals [i ])) {
49
+ // if two intervals overlap, then merge the two
50
+ mergedIntervals [lastMergedIndex ] = new int []{Math .min (mergedIntervals [lastMergedIndex ][0 ], intervals [i ][0 ]),
51
+ Math .max (mergedIntervals [lastMergedIndex ][1 ], intervals [i ][1 ])};
52
+ } else {
53
+ mergedIntervals [++lastMergedIndex ] = intervals [i ];
54
+ }
55
+ }
56
+
57
+ return Arrays .copyOfRange (mergedIntervals , 0 , lastMergedIndex + 1 );
58
+ }
59
+
60
+ private static boolean isOverlap (int [] interval1 , int [] interval2 ) {
61
+ return interval1 [0 ] <= interval2 [0 ] && interval1 [1 ] >= interval2 [0 ];
62
+ }
63
+
64
+ private static class IntervalComparator implements Comparator <int []> {
65
+ @ Override
66
+ public int compare (int [] interval1 , int [] interval2 ) {
67
+ return interval1 [0 ] - interval2 [0 ];
68
+ }
69
+ }
70
+
71
+ public static void main (String [] args ) {
72
+ System .out .println (Arrays .deepToString (merge (new int [][]{{1 , 3 }, {2 , 6 }, {8 , 10 }, {15 , 18 }})));
73
+ System .out .println (Arrays .deepToString (merge (new int [][]{{1 , 4 }, {4 , 5 }})));
74
+ }
75
+ }
0 commit comments