二分查找模板

标准二分查找的模板:

class BinarySearch {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target) return mid;
            else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
}

循环条件: left <= right
中间位置计算: mid = left + ((right -left) >> 1)
左边界更新:left = mid + 1
右边界更新: right = mid - 1
返回值: mid / -1

这里有几点需要注意:

我们的循环条件中包含了
1、left == right的情况,则我们必须在每次循环中改变 left 和 right的指向,以防止进入死循环
2、循环终止的条件包括:
(1)找到了目标值
(2)left > right (这种情况发生于当left, mid, right指向同一个数时,这个数还不是目标值,则整个查找结束。)
3、left + ((right -left) >> 1) 其实和 (left + right) / 2是等价的,这样写的目的一个是为了防止 (left + right)出现溢出,一个是用右移操作替代除法提升性能。
4、left + ((right -left) >> 1) 对于目标区域长度为奇数而言,是处于正中间的,对于长度为偶数而言,是中间偏左的。因此左右边界相遇时,只会是以下两种情况:

(1)left/mid , right (left, mid 指向同一个数,right指向它的下一个数)
(2)left/mid/right (left, mid, right 指向同一个数)
即因为mid对于长度为偶数的区间总是偏左的,所以当区间长度小于等于2时,mid 总是和 left在同一侧。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常...
    Jesse1995阅读 2,469评论 0 0
  • 模板原地址,从大佬那里习得的另一位的解析,下面有更具体的分析模板一共有两种,适用于两种不同的情况,第一种是: 我们...
    Charon_ted阅读 695评论 0 0
  • 二分查找是面试常考的知识点,其方法是在有序序列中寻找满足特定条件的值,存在许多不同的变种,最近在刷Leetcode...
    喵帕斯0_0阅读 589评论 0 1
  • 原文链接: 点这里更多内容就在我的个人博客 BlackBlog.tech 欢迎关注!谢谢大家! 本文源自LeetC...
    BlackBlog__阅读 3,536评论 2 13
  • 为谁抚摸的心动 为谁等候的烟火 敌不过那月下的一吻 别人的窗下留着你的叹息 太迟太迟啊 我已忘了如何去爱
    未明花香阅读 160评论 0 0

友情链接更多精彩内容