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.