题目:给定一个区间集合,合并里面重叠区间;并返回新的不含重叠区间的集合。例如,输入:[1,5],[6,10],[4,6],[15,20]。输出:[1,10],[15,20]。
package main
import (
"fmt"
"sort"
)
type Interval struct {
start int
end int
}
type PointSlice []Point
func (p PointSlice) Len() int { // 重写 Len() 方法
return len(p)
}
func (p PointSlice) Swap(i, j int) { // 重写 Swap()方法
p[i], p[j] = p[j], p[i]
}
func (p PointSlice) Less(i, j int) bool { // 重写 Less
if (p[i].v < p[j].v) ||
(p[i].v == p[j].v && p[i].t == 0 && p[j].t == 1) {
return true
}
return false
}
type Point struct {
v int
t int
n int
}
func merge(a []Interval) []Interval {
count, length := 0, len(a)
res := make([]Interval, 0)
if length == 0 || length == 1 {
return res
}
points := make([]Point, length*2)
for i := 0; i < length; i += 1 {
points[i*2] = Point{a[i].start, 0, i}
points[i*2+1] = Point{a[i].end, 1, i}
}
// 排序
sort.Sort(PointSlice(points))
length *= 2
ins := Interval{}
for i := 0; i < length; i += 1 {
if points[i].t == 0 {
if count == 0 {
ins.start = points[i].v
}
count++
} else {
if count == 1 {
ins.end = points[i].v
n := ins
res = append(res, n)
}
count--
}
}
return res
}
func main() {
// 测试用例W
a := []Interval{Interval{1, 5}, Interval{6, 10}, Interval{4, 6}, Interval{15, 20}}
fmt.Println(merge(a))
}