Rust Flags
fn flags(a: &[i64]) -> i64 {
let size = a.len();
let mut peaks = vec![false; size];
for i in 1..size {
let next = a.get(i + 1).copied().unwrap_or(0);
peaks[i] = a[i - 1] < a[i] && a[i] > next;
}
let mut next_peak = vec![-1i64; size];
if size > 0 {
next_peak[size - 1] = -1;
for i in (0..size - 1).rev() {
next_peak[i] = if peaks[i] { i as i64 } else { next_peak[i + 1] };
}
}
let mut i = 1i64;
let mut result = 0i64;
while i * (i - 1) <= size as i64 {
let mut pos = 0i64;
let mut num = 0i64;
while pos < size as i64 && num < i {
pos = next_peak[pos as usize];
if pos == -1 {
break;
}
num += 1;
pos += i;
}
i += 1;
result = result.max(num);
}
result
}
This finds all peaks first, then checks how many flags can be placed while keeping the required distance.