Skip to content

Commit 80a1e4c

Browse files
committed
add merge-intervals
1 parent 530f0d8 commit 80a1e4c

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

leetcode/merge-intervals.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package leetcode
2+
3+
func qsort(intervals [][]int, low, high int) {
4+
if low >= high {
5+
return
6+
}
7+
base := intervals[low][0]
8+
9+
i := low + 1
10+
j := high - 1
11+
for {
12+
for i <= j && intervals[i][0] < base {
13+
i++
14+
}
15+
for i <= j && intervals[j][0] >= base {
16+
j--
17+
}
18+
if i >= j {
19+
break
20+
}
21+
// fmt.Printf("i %d j %d\n", i, j)
22+
intervals[i], intervals[j] = intervals[j], intervals[i]
23+
}
24+
intervals[j], intervals[low] = intervals[low], intervals[j]
25+
qsort(intervals, low, j)
26+
qsort(intervals, j+1, high)
27+
}
28+
29+
func merge(intervals [][]int) [][]int {
30+
if len(intervals) == 0 {
31+
return intervals
32+
}
33+
qsort(intervals, 0, len(intervals))
34+
result := make([][]int, 0, len(intervals))
35+
last := make([]int, 2)
36+
last[0], last[1] = intervals[0][0], intervals[0][1]
37+
for i := 1; i < len(intervals); i++ {
38+
if isAdjacent(last, intervals[i]) {
39+
// fmt.Printf("merge! %v %v\n", last, intervals[i])
40+
if last[1] < intervals[i][1] {
41+
last[1] = intervals[i][1]
42+
}
43+
} else {
44+
result = append(result, last)
45+
last = intervals[i]
46+
}
47+
}
48+
result = append(result, last)
49+
50+
return result
51+
}

leetcode/merge-intervals_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package leetcode
2+
3+
import "testing"
4+
5+
func Test_merge_none(t *testing.T) {
6+
data := [][]int{
7+
[]int{1, 2},
8+
[]int{3, 6},
9+
[]int{8, 10},
10+
[]int{15, 18},
11+
}
12+
result := merge(data)
13+
actual := pairs_array(result)
14+
expect := "[[1,2][3,6][8,10][15,18]]"
15+
16+
if actual != expect {
17+
t.Errorf("expect: %s, actual: %s", expect, actual)
18+
}
19+
}
20+
21+
func Test_merge_front(t *testing.T) {
22+
data := [][]int{
23+
[]int{1, 3},
24+
[]int{2, 6},
25+
[]int{8, 10},
26+
[]int{15, 18},
27+
}
28+
result := merge(data)
29+
actual := pairs_array(result)
30+
expect := "[[1,6][8,10][15,18]]"
31+
32+
if actual != expect {
33+
t.Errorf("expect: %s, actual: %s", expect, actual)
34+
}
35+
}
36+
37+
func Test_merge_all(t *testing.T) {
38+
data := [][]int{
39+
[]int{1, 4},
40+
[]int{4, 5},
41+
[]int{5, 6},
42+
}
43+
result := merge(data)
44+
actual := pairs_array(result)
45+
expect := "[[1,6]]"
46+
47+
if actual != expect {
48+
t.Errorf("expect: %s, actual: %s", expect, actual)
49+
}
50+
}
51+
52+
func Test_merge_inner(t *testing.T) {
53+
data := [][]int{
54+
[]int{1,4},
55+
[]int{2,3},
56+
}
57+
result := merge(data)
58+
actual := pairs_array(result)
59+
expect := "[[1,4]]"
60+
61+
if actual != expect {
62+
t.Errorf("expect: %s, actual: %s", expect, actual)
63+
}
64+
}

0 commit comments

Comments
 (0)