-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathinsert_interval.go
40 lines (36 loc) · 944 Bytes
/
insert_interval.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
import "sort"
func min(a, b int) int {
if a <= b {
return a
}
return b
}
func max(a, b int) int {
if a >= b {
return a
}
return b
}
func insert(intervals [][]int, newInterval []int) [][]int {
idx := sort.Search(len(intervals), func(i int) bool {
return intervals[i][1] >= newInterval[0]
})
idx2 := sort.Search(len(intervals), func(i int) bool {
return intervals[i][0] > newInterval[1]
})
if idx == idx2 && (idx == len(intervals) || newInterval[1] < intervals[idx][0]) {
result := make([][]int, len(intervals)+1)
copy(result, intervals[:idx])
result[idx] = newInterval
copy(result[idx+1:], intervals[idx:])
return result
}
intervals[idx][0] = min(intervals[idx][0], newInterval[0])
intervals[idx][1] = max(intervals[idx2-1][1], newInterval[1])
if diff := idx2 - idx; diff > 1 {
copy(intervals[idx+1:], intervals[idx2:])
intervals = intervals[:len(intervals)-(diff-1)]
}
return intervals
}