123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- 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))
- } */
|