leetcode_rust/
binary_search.rs

1#![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}