Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 904753c

Browse files
committed
Merge Intervals done
1 parent 82cbaa6 commit 904753c

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /