对应leetcode 的704题。

需求:

在一个数组 [..] 里面找一个Target目标元素,判断Target是否存在,

如果存在target 元素 返回对应的数组下标,否则返回-1。

使用二分查找有一个前提,数组必须是有序的。

这里默认数组为升序。

[left,right] 左闭 右闭 指区间包含left和right。

[left,right) 左闭 右开 ,)开指区间不包含right。

左闭右闭写法:

pub fn search(array:&Vec<i32>,target:i32) -> i32
{
    let mut left = 0 ;
    let mut right = array.len() -1;
    
    while left <= right
    {
        let mid = (left + right) / 2;
        if array[mid] > target
        {
            right = mid - 1
        }
        else if array[mid] < target
        {
            left = mid + 1
        }
        else {
            return mid as i32
        }
    }
    -1
}


#[cfg(test)]
mod tests
{
    use super::*;

    #[test]
    fn search_return_5()
    {
        let arr = vec![1,2,3,4,5,6,7,8,9];
        let result = search(&arr, 6);

        assert!(result == 5);
    }
    #[test]
    fn search_return_negative1()
    {
        let arr = vec![1,2,3,4,5,6,7,8,9];
        let result = search(&arr, 10);

        assert!(result == -1);
    }
}

左闭右开写法:

//左闭右开写法
pub fn search2(array:&Vec<i32>,target:i32) -> i32
{
    let mut left = 0 ;
    let mut right = array.len() -1;
    //区间不包含right
    while left < right
    {
        let mid = (left + right) / 2;
        if array[mid] > target
        {
            right = mid //由于区间判断不包含right 所以不用-1
        }
        else if array[mid] < target
        {
            left = mid + 1
        }
        else {
            return mid as i32
        }
    }
    -1
}