leetcode_rust/
binary_search.rs1#![allow(dead_code)]
2
3pub fn search(nums: Vec<i32>, target: i32) -> i32 {
4 let mut i = 0i32;
5 let mut j = nums.len() as i32 - 1;
6 let mut mid = (i + j) / 2;
7 while i <= j {
8 if nums[mid as usize] == target {
9 return mid;
10 } else if nums[mid as usize] > target {
11 j = mid - 1;
12 } else {
13 i = mid + 1;
14 }
15 mid = (i + j) / 2;
16 }
17
18 -1
19}
20
21pub fn search2(nums: Vec<i32>, target: i32) -> i32 {
22 if nums.len() == 1 && nums[0] != target {
23 return -1;
24 }
25
26 let mut l = 0;
27 let mut r = nums.len() - 1;
28 let mut i = nums.len() / 2;
29
30 while l < r {
31 if nums[i] > target {
32 r = i - 1;
33 } else if nums[i] < target {
34 l = i + 1;
35 } else {
36 return i as i32;
37 }
38 i = (r + l) / 2;
39 }
40
41 if nums[i] != target {
42 return -1;
43 }
44
45 i as i32
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn test1() {
54 assert_eq!(search(vec![-1, 0, 3, 5, 9, 12], 9), 4);
55 assert_eq!(search(vec![2, 5], 0), -1);
56 assert_eq!(search(vec![5], 5), 0);
57 }
58
59 #[test]
60 fn test2() {
61 assert_eq!(search2(vec![-1, 0, 3, 5, 9, 12], 9), 4);
62 assert_eq!(search2(vec![2, 5], 0), -1);
63 assert_eq!(search2(vec![5], 5), 0);
64 }
65}