MCPcopy Create free account
hub / github.com/austingebauer/go-leetcode / insert0

Function insert0

insert_interval_57/solution.go:82–148  ·  view source on GitHub ↗

Note: good attempt with 152 / 154 test cases passed. This got messy. Tried to merge newInterval into intervals. Can do better!

(intervals [][]int, newInterval []int)

Source from the content-addressed store, hash-verified

80// Note: good attempt with 152 / 154 test cases passed.
81// This got messy. Tried to merge newInterval into intervals. Can do better!
82func insert0(intervals [][]int, newInterval []int) [][]int {
83 if len(intervals) == 0 {
84 return [][]int{newInterval}
85 }
86
87 // interval goes in front and doesn't merge at all
88 if newInterval[1] < intervals[0][0] {
89 return append([][]int{newInterval}, intervals...)
90 }
91
92 // interval goes in front and merges
93 if newInterval[1] == intervals[0][0] {
94 intervals[0][0] = newInterval[0]
95 return intervals
96 }
97
98 // newInterval start is less than first interval start
99 if newInterval[0] < intervals[0][0] {
100 intervals[0][0] = newInterval[0]
101 intervals[0][1] = int(math.Max(float64(newInterval[1]), float64(intervals[0][1])))
102 }
103
104 for i := 0; i < len(intervals); i++ {
105 interval := intervals[i]
106
107 // find where the start is less than the finish of interval
108 if newInterval[0] <= interval[1] {
109 // while newIntervals end is greater than starts of subsequent intervals
110 j := i
111 for j < len(intervals) {
112 // insert in between j and j-1
113 if i > 0 && intervals[j-1][1] < newInterval[0] && intervals[j][0] > newInterval[1] {
114 return append(append(append([][]int{}, intervals[:j]...), newInterval), intervals[j:]...)
115 }
116
117 if newInterval[1] <= intervals[j][0] {
118 break
119 }
120
121 j++
122 }
123
124 if j == len(intervals) {
125 intervals[i][0] = int(math.Min(float64(intervals[i][0]),
126 float64(newInterval[0])))
127 intervals[i][1] = int(math.Max(float64(newInterval[1]),
128 float64(intervals[len(intervals)-1][1])))
129 intervals = intervals[0 : i+1]
130 } else if newInterval[1] < intervals[j][0] {
131 intervals[i][0] = int(math.Min(float64(intervals[i][0]),
132 float64(newInterval[0])))
133 intervals[i][1] = int(math.Max(float64(intervals[j-1][1]),
134 float64(newInterval[1])))
135 if j-i > 1 {
136 intervals = append(append([][]int{}, intervals[0:j-1]...), intervals[j:]...)
137 }
138 } else if newInterval[1] <= intervals[j][0] {
139 intervals[i][1] = intervals[j][1]

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected