对应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
}