1use std::cmp::Ordering;
2pub fn find_distance(list: &[u32]) -> Option<usize> {
12 let mut smaller_idx_list: Vec<usize> = Vec::with_capacity(list.len());
13
14 let mut smallest_idx_now = 0;
15
16 smaller_idx_list.push(smallest_idx_now);
17
18 for idx in 1..list.len() {
20 if list[idx] < list[smallest_idx_now] {
21 smallest_idx_now = idx;
22 smaller_idx_list.push(smallest_idx_now);
23 }
24 }
25
26 let mut idx_of_biggest = list.len() - 1;
28
29 let mut march_idx = idx_of_biggest;
31
32 let mut max_distance_now: Option<usize> = None;
33
34 for small_idx in smaller_idx_list.iter().rev() {
35 while march_idx > *small_idx {
37 match list[march_idx].cmp(&list[idx_of_biggest]) {
39 Ordering::Equal => (),
40 Ordering::Greater => idx_of_biggest = march_idx,
41 Ordering::Less => {
42 march_idx -= 1;
44 continue;
45 }
46 }
47
48 if list[idx_of_biggest] > list[*small_idx] {
49 let distance_now = idx_of_biggest - *small_idx;
50
51 match max_distance_now {
52 Some(val) => {
53 if distance_now > val {
55 max_distance_now = Some(distance_now);
56 }
57 }
58 None => max_distance_now = Some(distance_now),
60 }
61
62 break;
63 } else {
64 march_idx -= 1;
65 }
66 }
67 }
68
69 max_distance_now
70}