算法18,二分查找

二分查找核心知识点梳理

一、算法原理

二分查找基于有序数组 的特性,利用「二段性」缩小目标范围:对于当前区间 [left, right],取中间位置 mid,通过比较 nums[mid]与目标值 target的大小,确定 target所在子区间,重复此过程直到找到目标或区间无效。

二、通用模板(朴素版)

以「左闭右闭区间 [left, right]」为例(区间内所有下标都有效),模板代码如下:

复制代码
public int search(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1; // 右闭区间,初始右边界为数组长度-1
    while (left <= right) {      // 区间有效时持续缩小范围(left==right时仍需检查)
        int mid = left + (right - left) / 2; // 防止(left+right)溢出的mid计算方式
        if (nums[mid] < target) {
            // target在右半段,调整左边界排除左半段
            left = mid + 1;
        } else if (nums[mid] > target) {
            // target在左半段,调整右边界排除右半段
            right = mid - 1;
        } else {
            // 找到目标,返回对应下标
            return mid;
        }
    }
    // 循环结束后仍未找到,返回-1
    return -1;
}
三、关键细节解析
  1. 循环结束条件

    • 若采用「左闭右闭」区间(right = nums.length - 1),循环条件为 left <= right(保证 left == right时仍检查中间元素)。

    • 若采用「左闭右开」区间(right = nums.length),循环条件为 left < right(此时 right初始越界,区间内有效下标为 [left, right))。

  2. mid 计算防溢出

    直接写 (left + right) / 2可能因 left + right超过整数范围(如 leftright极大时)导致溢出。改用 left + (right - left) / 2可避免此问题。

  3. 边界调整逻辑

    • nums[mid] < target时,target一定在 mid右侧,因此左边界调整为 mid + 1(排除 mid及左侧元素)。

    • nums[mid] > target时,target一定在 mid左侧,因此右边界调整为 mid - 1(排除 mid及右侧元素)。

    • nums[mid] == target,直接返回 mid(已找到目标)。

四、示例演示(以有序数组查找为例)

假设数组 nums = [1, 3, 5, 7, 9],目标 target = 5

  • 初始 left=0, right=4,计算 mid = 0 + (4-0)/2 = 2nums[2]=5等于 target,直接返回 2

若目标 target = 2

  • 第一轮:left=0, right=4, mid=2nums[2]=5 > 2right=1(缩小到左半段 [0,1])。

  • 第二轮:left=0, right=1, mid=0nums[0]=1 < 2left=1(缩小到右半段 [1,1])。

  • 第三轮:left=1, right=1, mid=1nums[1]=3 > 2right=0(区间失效)。

  • 循环结束(left > right),返回 -1

通过以上步骤,可系统掌握二分查找的核心逻辑、代码实现及易错点,确保在有序数组查找场景中高效且正确地应用该算法。

相关推荐
思麟呀6 分钟前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~7 分钟前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa05103016 分钟前
【板子】ST表
c++·笔记·算法·板子
qydz1117 分钟前
杰理开发基础知识(3)
开发语言·嵌入式开发·杰理科技
贾斯汀frank18 分钟前
C# 15 类型系统改进:Union Types
开发语言·windows·c#
阿里嘎多学长29 分钟前
2026-07-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CHHH_HHH1 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦1 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法
数智化转型推荐官1 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互1 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维