Rust Equi Leader
fn equi_leader(a: &[i64]) -> i64 {
let mut leader_size = 0i64;
let mut value = 0;
for &v in a {
if leader_size == 0 {
leader_size += 1;
value = v;
} else if value != v {
leader_size -= 1;
} else {
leader_size += 1;
}
}
let candidate = if leader_size > 0 { value } else { -1 };
let leader_count = a.iter().filter(|&&v| v == candidate).count() as i64;
let leader = if leader_count > a.len() as i64 / 2 { candidate } else { -1 };
let count = a.len() as i64;
let mut l_leader_count = 0i64;
let mut equi_leaders = 0i64;
for (k, &v) in a.iter().enumerate() {
let k = k as i64;
let left_half = (k + 1) / 2;
let right_half = (count - k - 1) / 2;
if v == leader {
l_leader_count += 1;
}
let r_leader_count = leader_count - l_leader_count;
if l_leader_count > left_half && r_leader_count > right_half {
equi_leaders += 1;
}
}
equi_leaders
}
This keeps leader counts on both sides of the split and counts positions where the same leader survives in each half.