PHP Peaks
function peaks(array $a): int
{
$n = count($a);
if ($n <= 2) {
return 0;
}
$sum = array_fill(0, $n, 0);
$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])) {
$dist = max($dist, $i - $last);
$last = $i;
++$sum[$i];
}
}
if (($sum[$n - 1] = $sum[$n - 2]) === 0) {
return 0;
}
$dist = max($dist, $n - $last);
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;
}
}
}
for ($last = $dist; $n % $last;) {
++$last;
}
return (int)($n / $last);
}
This finds the peak positions, then tests how many equal blocks can each contain at least one peak.