package main
import (
"sort"
)
// Interval ...
type Interval struct {
Start int
End int
}
// Endpoint ...
type Endpoint struct {
Val int
IsEnd bool
}
// PointSlice ...
type PointSlice []Endpoint
func (p PointSlice) Len() int { return len(p) }
func (p PointSlice) Less(i, j int) bool {
// 1( 4) 4( 6) -> 1( 4( 4) 6)
// important!
if p[i].Val == p[j].Val {
return p[j].IsEnd
}
return p[i].Val < p[j].Val
}
func (p PointSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
/**
* Definition for an interval.
* type Interval struct {
* Start int
* End int
* }
*/
func mergeOld(intervals []Interval) (res []Interval) {
points := []Endpoint{}
for _, v := range intervals {
points = append(points, Endpoint{v.Start, false})
points = append(points, Endpoint{v.End, true})
}
sort.Sort(PointSlice(points))
for i, cnt := 0, 0; i < len(points); i++ {
if cnt == 0 {
inter := Interval{points[i].Val, 0}
res = append(res, inter)
}
if !points[i].IsEnd {
cnt++
} else {
cnt--
if cnt == 0 {
res[len(res)-1].End = points[i].Val
}
}
}
return
}
// By : by which function to sort intervals
type By func(p, q *Interval) bool
// IntervalSorter : interface for sorting intervals
type IntervalSorter struct {
intervals []Interval
by By
}
func (p *IntervalSorter) Len() int {
return len(p.intervals)
}
func (p *IntervalSorter) Less(i, j int) bool {
return p.by(&p.intervals[i], &p.intervals[j])
}
func (p *IntervalSorter) Swap(i, j int) {
p.intervals[i], p.intervals[j] = p.intervals[j], p.intervals[i]
}
// Sort : usage: By(func).Sort(intervals)
func (by By) Sort(intervals []Interval) {
is := &IntervalSorter{intervals, by}
sort.Sort(is)
}
func startValue(p, q *Interval) bool {
return p.Start < q.Start
}
/* func maxInt(x, y int) int {
if x > y {
return x
}
return y
} */
/**
* Definition for an interval.
* type Interval struct {
* Start int
* End int
* }
*/
func merge(intervals []Interval) (res []Interval) {
if len(intervals) < 2 {
return intervals
}
By(startValue).Sort(intervals)
res = append(res, intervals[0])
for i := 1; i < len(intervals); i++ {
if intervals[i].Start > res[len(res)-1].End {
res = append(res, intervals[i])
continue
}
res[len(res)-1].End = maxInt(intervals[i].End, res[len(res)-1].End)
}
return
}
/* func main() {
i1 := []Interval{{1, 3}, {2, 6}, {8, 10}, {15, 18}}
i2 := []Interval{}
i3 := []Interval{{1, 4}, {4, 5}, {5, 6}}
i4 := []Interval{{1, 4}, {0, 1}}
fmt.Println(merge(i1))
fmt.Println(merge(i2))
fmt.Println(merge(i3))
fmt.Println(merge(i4))
} */