Go Peaks
func peaks(a []int) int {
n := len(a)
if n <= 2 {
return 0
}
sum := make([]int, n)
last := -1
dist := 0
for i := 1; i+1 < n; i++ {
sum[i] = sum[i-1]
if a[i] > a[i-1] && a[i] > a[i+1] {
if i-last > dist {
dist = i - last
}
last = i
sum[i]++
}
}
sum[n-1] = sum[n-2]
if sum[n-1] == 0 {
return 0
}
if n-last > dist {
dist = n - last
}
j := 0
for i := dist>>1 + 1; i < dist; i++ {
if n%i == 0 {
last = 0
for j = i; j <= n; j += i {
if sum[j-1] <= last {
break
}
last = sum[j-1]
}
if j > n {
return n / i
}
}
}
last = dist
for n%last != 0 {
last++
}
return n / last
}
This finds the peak positions, then tests how many equal blocks can each contain at least one peak.