Сортировка
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
sort.Slice изменяет входной слайс.
После сортировки по началу большинство задач сводятся к одному линейному проходу.
Минимальный синтаксис, который понадобится в решении.
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
sort.Slice изменяет входной слайс.
type Interval struct { Start, End int }
Структура читается лучше, но LeetCode обычно даёт [][]int.
Три идиоматичных решения на Go с оценкой времени и памяти.
Сравниваем начало с концом последнего результата.
O(n log n) time · O(n) outputfunc merge(a [][]int) [][]int {
sort.Slice(a, func(i, j int) bool { return a[i][0] < a[j][0] })
out := [][]int{}
for _, cur := range a {
if len(out) == 0 || out[len(out)-1][1] < cur[0] {
out = append(out, cur)
} else {
out[len(out)-1][1] = max(out[len(out)-1][1], cur[1])
}
}
return out
}
Жадно выбираем самое раннее окончание.
O(n log n) time · O(1) spacefunc findMinArrowShots(points [][]int) int {
sort.Slice(points, func(i, j int) bool { return points[i][1] < points[j][1] })
arrows, end := 0, 0
for i, p := range points {
if i == 0 || p[0] > end { arrows++; end = p[1] }
}
return arrows
}
После сортировки соседние встречи не должны пересекаться.
O(n log n) time · O(1) spacefunc canAttend(intervals [][]int) bool {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
for i := 1; i < len(intervals); i++ {
if intervals[i][0] < intervals[i-1][1] { return false }
}
return true
}