Go Flags
func flags(a []int) int {
size := len(a)
peaks := make([]bool, size)
for i := 1; i < size; i++ {
nextVal := 0
if i+1 < size {
nextVal = a[i+1]
}
peaks[i] = a[i-1] < a[i] && a[i] > nextVal
}
next := make([]int, size)
next[size-1] = -1
for i := size - 2; i >= 0; i-- {
if peaks[i] {
next[i] = i
} else {
next[i] = next[i+1]
}
}
result := 0
for i := 1; i*(i-1) <= size; i++ {
pos, num := 0, 0
for pos < size && num < i {
pos = next[pos]
if pos == -1 {
break
}
num++
pos += i
}
if num > result {
result = num
}
}
return result
}
This finds all peaks first, then checks how many flags can be placed while keeping the required distance.