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

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

相关推荐
IT策士1 小时前
Python mcp研究:入门到精通
开发语言·python·qt
罗技1231 小时前
告别“兼容模式“:Easysearch 有了自己的官方 Python 客户端
开发语言·python
weixin_446729161 小时前
java网络通讯
java·开发语言
NE_STOP1 小时前
Redis--集群搭建与主从复制原理
java
IT策士1 小时前
Python 常见的设计模型:入门到精通
开发语言·python
好奇的菜鸟1 小时前
Java开发常用中间件,Docker安装。
java·docker·中间件
许泽宇的技术分享1 小时前
别再把 AI Agent 当“会聊天的脚本”:Hermes Agent 源码级拆解(架构、框架、实战、趋势,一文吃透)
java·linux·网络
不会写DN1 小时前
如何通过 Python 实现招聘平台自动投递
开发语言·前端·python
lbb 小魔仙1 小时前
Ollama + Python 本地大模型部署与API调用:从零开始搭建私有AI助手
开发语言·人工智能·python