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