| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | package main/** * Definition for an interval. * type Interval struct { *	   Start int *	   End   int * } */func insert(intervals []Interval, newInterval Interval) (in []Interval) {	n := len(intervals)	if n == 0 {		return append(in, newInterval)	}	beg := search(intervals, 0, n-1, newInterval.Start)	end := search(intervals, beg, n-1, newInterval.End)	l, r := newInterval.Start, newInterval.End	if beg > n-1 { // It's trival, but also very important		in = intervals	} else if l < intervals[beg].Start {		in = append(in, intervals[:beg]...) // And, copy instead of reference	} else if l > intervals[beg].End {		in = append(in, intervals[:beg+1]...)	} else {		l = intervals[beg].Start		in = append(in, intervals[:beg]...)	}	if end > n-1 {		in = append(in, Interval{l, r})	} else if r < intervals[end].Start {		in = append(in, Interval{l, r})		in = append(in, intervals[end:]...)	} else if r > intervals[end].End {		in = append(in, Interval{l, r})		if end != n-1 {			in = append(in, intervals[end+1:]...)		}	} else {		r = intervals[end].End		in = append(in, Interval{l, r})		if end != n-1 {			in = append(in, intervals[end+1:]...)		}	}	return}func search(in []Interval, beg, end, val int) int { // Binary search in intervals	for beg <= end {		mid := (beg + end) / 2		if val > in[mid].End {			beg = mid + 1		} else if val < in[mid].Start {			end = mid - 1		} else {			return mid		}	}	return beg}// func main() {// 	in := []Interval{{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}}// 	ans := insert(in, Interval{4, 8})// 	fmt.Println(ans)// 	in = []Interval{{1, 5}}// 	ans = insert(in, Interval{6, 8})// 	fmt.Println(ans)// 	in = []Interval{}// 	ans = insert(in, Interval{2, 7})// 	fmt.Println(ans)// 	in = []Interval{{1, 5}}// 	ans = insert(in, Interval{0, 0})// 	fmt.Println(ans)// }
 |