算法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

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

相关推荐
Gigavision11 分钟前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp21 分钟前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
aramae31 分钟前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
彧azz2 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
泡海椒2 小时前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55233 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
wno7043 小时前
Spring Security权限控制
java·python·spring
杨运交4 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring