Skip to content

Commit cade61f

Browse files
committed
Add the solution for leetcode problem #56
1 parent b2df7bd commit cade61f

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.sean.array;
2+
3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
6+
/***
7+
* 56. Merge Intervals
8+
*/
9+
public class IntervalMerger {
10+
public int[][] merge(int[][] intervals) {
11+
if (intervals.length <= 1) return intervals;
12+
13+
int i = 0, j = 1;
14+
int len = intervals.length;
15+
16+
// sort by the start point N*lgN
17+
Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));
18+
19+
int reducedCnt = 0;
20+
while (i < j && j < len) {
21+
int[] merged = doMerge(intervals[i], intervals[j]);
22+
if (merged == null) {
23+
i = j;
24+
j++;
25+
} else {
26+
intervals[i][0] = merged[0];
27+
intervals[i][1] = merged[1];
28+
29+
// marked as merged
30+
intervals[j][0] = -1;
31+
intervals[j][1] = -1;
32+
33+
++reducedCnt;
34+
35+
j++;
36+
}
37+
}
38+
39+
return filterMergedArray(intervals, reducedCnt, len);
40+
}
41+
42+
int[] doMerge(int[] line1, int[] line2) {
43+
int s1 = line1[0];
44+
int e1 = line1[1];
45+
int s2 = line2[0];
46+
int e2 = line2[1];
47+
48+
if (s2 > e1) {
49+
return null;
50+
} else {
51+
return new int[]{s1, Math.max(e1, e2)};
52+
}
53+
}
54+
55+
private int[][] filterMergedArray(int[][] intervals, int reducedCnt, int len) {
56+
int[][] out = new int[len - reducedCnt][2];
57+
int m = 0;
58+
for (int k = 0; k < len; k++) {
59+
if (intervals[k][0] >= 0) {
60+
out[m++] = intervals[k];
61+
}
62+
}
63+
return out;
64+
}
65+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.sean.array;
2+
3+
import junit.framework.TestCase;
4+
5+
import static org.junit.Assert.assertArrayEquals;
6+
7+
public class IntervalMergerTest extends TestCase {
8+
9+
private IntervalMerger merger;
10+
11+
public void setUp() throws Exception {
12+
merger = new IntervalMerger();
13+
}
14+
15+
public void testMerge() {
16+
int[][] intervals = {{2, 3}, {4, 5}, {6, 7}, {8, 9}, {1, 10}};
17+
assertArrayEquals(new int[][]{{1, 10}}, merger.merge(intervals));
18+
19+
intervals = new int[][]{{1, 4}, {4, 5}};
20+
assertArrayEquals(new int[][]{{1, 5}}, merger.merge(intervals));
21+
22+
intervals = new int[][]{
23+
{3, 3}, {1, 1}, {0, 2}, {2, 2}, {1, 2}, {1, 3}, {1, 1}, {3, 3}, {2, 3}, {4, 6}
24+
};
25+
assertArrayEquals(new int[][]{{0, 3}, {4, 6}}, merger.merge(intervals));
26+
}
27+
}

0 commit comments

Comments
 (0)