use std::cmp::Ordering;
pub fn find_distance(list: &[u32]) -> Option<usize> {
let mut smaller_idx_list: Vec<usize> = Vec::with_capacity(list.len());
let mut smallest_idx_now = 0;
smaller_idx_list.push(smallest_idx_now);
for idx in 1..list.len() {
if list[idx] < list[smallest_idx_now] {
smallest_idx_now = idx;
smaller_idx_list.push(smallest_idx_now);
}
}
let mut idx_of_biggest = list.len() - 1;
let mut march_idx = idx_of_biggest;
let mut max_distance_now: Option<usize> = None;
for small_idx in smaller_idx_list.iter().rev() {
while march_idx > *small_idx {
match list[march_idx].cmp(&list[idx_of_biggest]) {
Ordering::Equal => (),
Ordering::Greater => idx_of_biggest = march_idx,
Ordering::Less => {
march_idx -= 1;
continue;
}
}
if list[idx_of_biggest] > list[*small_idx] {
let distance_now = idx_of_biggest - *small_idx;
match max_distance_now {
Some(val) => {
if distance_now > val {
max_distance_now = Some(distance_now);
}
}
None => max_distance_now = Some(distance_now),
}
break;
} else {
march_idx -= 1;
}
}
}
max_distance_now
}