算法 *-* 二分查找(三种情况, 统一模板)

回到顶部(go to top)

1. 总结

binary_search:普通的二分搜索,就是搜索target本身的值

left_bound:搜索比target小的数字的个数。有序数组nums = [2,3,5,7],target = 1,算法会返回 0,含义是:nums中小于 1 的元素有 0 个;nums = [2,3,5,7], target = 8,算法会返回 4,含义是:nums中小于 8 的元素有 4 个。

right_bound:搜索比target大的数字的个数。有序数组nums = [2,3,5,7],target = 1,算法会返回 4,含义是:nums中大于 1 的元素有 4 个;nums = [2,3,5,7], target = 8,算法会返回 0,含义是:nums中大于 8 的元素有 0 个。

 

只要修改两处(注释处)即可变化出三种写法

 

复制代码
int binary_search(int[] nums, int target) {
    int left = 0, right = nums.length - 1; 
    while(left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1; 
        } else if(nums[mid] == target) {
            // 直接返回
            return mid;
        }
    }
    // 直接返回
    return -1;
}

int left_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,锁定左侧边界
            right = mid - 1;
        }
    }
    // 最后要检查 left 越界的情况
    if (left >= nums.length || nums[left] != target)
        return -1;
    return left;
}


int right_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,锁定右侧边界
            left = mid + 1;
        }
    }
    // 最后要检查 right 越界的情况
    if (right < 0 || nums[right] != target)
        return -1;
    return right;
}
复制代码

 

 

回到顶部(go to top)

2. 易错点

2.1 防止int溢出

计算 mid 时需要防止溢出,代码中left + (right - left) / 2就和(left + right) / 2的结果相同,但是有效防止了left和right太大直接相加导致溢出

 

2.2 不要出现 else

不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节

 

回到顶部(go to top)

3. 参考文章

作者:labuladong, 我作了首诗,保你闭着眼睛也能写对二分查找
公众号:labuladong

 

posted on   frank_cui  阅读(126)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-12-24 Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较
2019-12-24 Java 基础 - 基本类型 & 包装类型
2018-12-24 spring配置文件头部xmlns配置精髓
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示