| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | package mainimport (	"sort")// Interval ...type Interval struct {	Start int	End   int}// Endpoint ...type Endpoint struct {	Val   int	IsEnd bool}// PointSlice ...type PointSlice []Endpointfunc (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 intervalstype By func(p, q *Interval) bool// IntervalSorter : interface for sorting intervalstype 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))} */
 |