// [1,3,5,6] 5 2
// [1,3,5,6] 2 1
// [1,3,5,6] 7 4
// [1,3,5,6] 0 0 额外加的
// 二分查找
pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
let mut left = 0; // 左边界
let mut right = nums.len() as i32 - 1;// 右边界
// 以mid值来构建循环逻辑的,感觉以target值来构建循环逻辑更好 虽然我没试
// mid所在值 小于 目标值动left mid推后 大于动right mid推前
while left <= right { // right到了left左边
let mid = left + (right - left) / 2;// 计算中间值 相加除2更好 语义更明确 (left + right) / 2 4长度中间值 2 5长度中间值 3 向零取整中间值模型 0 0 1 0 | 0 0 1 0 0
if nums[mid as usize] == target { // 判断是否找到
return mid;// 返回中间值
} else if nums[mid as usize] < target {// mid所在值 小于 目标值动left mid推后 大于动right mid推前
left = mid + 1;//如果不在乎性能的话 left += 1 也可以 这个分支只需要left是一直增加就行,照样能达成目的 用mid是更快点 个人建议用mid还是拆成left和right比较好,比较清晰
} else {
right = mid - 1;//如果不在乎性能的话 right -=1 也可以 这个分支只需要right是一直减小就行,照样能达成目的 用mid是更快点 个人建议用mid还是拆成left和right比较好,比较清晰
}
}
left
}
fn main() {
assert_eq!(search_insert(vec![1, 3, 5, 6], 5), 2);
assert_eq!(search_insert(vec![1, 3, 5, 6], 2), 1);
assert_eq!(search_insert(vec![1, 3, 5, 6], 7), 4);
assert_eq!(search_insert(vec![1, 3, 5, 6], 0), 0)
}
leetcode简单题10 N.35 搜索插入位置 rust描述
于 2024-07-01 17:36:56 首次发布