Rust Peaks
fn peaks(a: &[i64]) -> i64 {
let n = a.len();
if n <= 2 {
return 0;
}
let mut sum = vec![0i64; n];
let mut last: i64 = -1;
let mut dist: i64 = 0;
for i in 1..n - 1 {
sum[i] = sum[i - 1];
if a[i] > a[i - 1] && a[i] > a[i + 1] {
dist = dist.max(i as i64 - last);
last = i as i64;
sum[i] += 1;
}
}
sum[n - 1] = sum[n - 2];
if sum[n - 1] == 0 {
return 0;
}
dist = dist.max(n as i64 - last);
let mut i = (dist >> 1) + 1;
while i < dist {
if n as i64 % i == 0 {
let mut last_sum = 0i64;
let mut j = i;
while j <= n as i64 {
if sum[(j - 1) as usize] <= last_sum {
break;
}
last_sum = sum[(j - 1) as usize];
j += i;
}
if j > n as i64 {
return n as i64 / i;
}
}
i += 1;
}
let mut last_final = dist;
while n as i64 % last_final != 0 {
last_final += 1;
}
n as i64 / last_final
}
This finds the peak positions, then tests how many equal blocks can each contain at least one peak.