pub fn max_dist_to_closest(seats: Vec<i32>) -> i32 {
let n = seats.len() as i32;
let (mut left, mut right) = (vec![-1; seats.len()], vec![-1; seats.len()]);
let (mut from_left, mut from_right) = (-n, n + n - 1);
for i in 0..seats.len() {
if seats[i] == 1 {
// 已经被占住了
left[i] = -1;
from_left = i as i32; // 更新左边的人的位置
} else {
left[i] = (i as i32) - from_left;
}
}
for i in (0..seats.len()).rev() {
if seats[i] == 1 {
right[i] = -1;
from_right = i as i32;
} else {
right[i] = from_right - (i as i32);
}
}
left.into_iter()
.zip(right.into_iter())
.map(|(a, b)| a.min(b))
.max()
.unwrap_or(0)
}
pub fn max_dist_to_closest(seats: Vec<i32>) -> i32 {
let n = seats.len() as i32;
let (mut prev, mut future) = (-n, 0);
let mut ans = 0;
let mut cursor = 0;
while cursor < seats.len() {
if seats[cursor] == 1 {
prev = cursor as i32;
cursor += 1;
continue;
}
future = cursor;
while future < seats.len() && seats[future] == 0 {
future += 1;
}
let length = (future - cursor) as i32;
if prev < 0 {
// 开头, 只有右端找到了1
ans = ans.max(length);
} else if future == seats.len() {
// 结尾, 只有左端有1
ans = ans.max(length);
} else {
if length % 2 == 0 {
ans = ans.max(length / 2);
} else {
ans = ans.max(length / 2 + 1);
}
}
cursor = future; // 成段的0, 只需要判断一次
}
ans
}