letmut left = 1; letmut right = len - 2; while left < right { let mid = mid(left, right); if array[mid] > array[mid - 1] { right = mid - 1; } elseif array[mid] > array[mid + 1] { left = mid + 1; } else { returnSome(mid); } }
Some(left) }
/// 计算两个无符号值的中间值 fnmid<T: Ord + Div<Output = T> + Add<Output = T> + Copy + Sub<Output = T> + From<u8>>( v1: T, v2: T, ) -> T { match v1.cmp(&v2) { Ordering::Less => { let v = v2 - v1; v1 + v / T::from(2u8) } Ordering::Equal => v1, Ordering::Greater => { let v = v1 - v2; v2 + v / T::from(2u8) } } }
/// 判断一个索引是否为局部最小值的索引 fnis_local_minimum(array: &[i32], index: usize) -> bool { let len = array.len(); if len == 0 { returnfalse; } if len == 1 { return index == 0; }
let range = 0..len; if !range.contains(&index) { returnfalse; }
// 1. `0` 位置如果比 `1` 位置数小,则 `0` 位置为局部最小; if index == 0 && array[0] < array[1] { returntrue; }
// 2. `N-1` 位置如果比 `N-2` 位置数小,则 `N-1` 位置为局部最小; if index == len - 1 && array[len - 1] < array[len - 2] { returntrue; }