跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二分查找算法原理与常见变体实战

二分查找是处理有序数据的高效算法,核心在于利用二段性不断缩小搜索区间。本文详细解析了四种常见变体:基础查找、寻找目标范围、搜索插入位置及旋转数组最小值。重点讲解了不同场景下左右边界的收缩逻辑与 mid 取值技巧,避免死循环与越界错误。通过对比不同模板的差异,帮助读者理解二分查找的本质而非死记硬背,提升解决复杂问题的实战能力。

www发布于 2026/3/24更新于 2026/7/334 浏览
二分查找算法原理与常见变体实战

二分查找算法原理与常见变体实战

二分查找的核心在于利用数据的有序性,通过不断缩小搜索区间来快速定位目标。虽然大家常认为它仅适用于简单的数值查找,但在实际开发中,无论是缓存索引还是参数优化,只要数据具备'二段性',二分思想都能派上用场。不过,很多开发者容易在边界处理上出错,导致死循环或越界。下面结合几个经典场景,梳理一下二分查找的实现细节。

算法原理与模板

二分的本质不是简单的折半,而是根据目标值与中间值的比较关系,排除掉一半不可能包含目标的区间。针对不同需求(如找左端点、右端点),我们需要微调 mid 的计算方式和收缩策略。

基础查找

最基础的二分查找用于判断目标是否存在。关键在于循环条件 left <= right 以及 mid 的取整方式。

int left = 0, right = nums.size() - 1;
while (left <= right) {
    int mid = left + (right - left) / 2;
    if (nums[mid] == target) return mid;
    else if (nums[mid] > target) right = mid - 1;
    else left = mid + 1;
}
return -1;

寻找目标范围

当数组中存在重复元素时,我们需要找到目标值出现的起始和结束位置。这可以看作两次独立的二分查找:一次找左边界,一次找右边界。

找左边界时,如果 mid 落在目标左侧,说明目标在右边,left = mid + 1;如果 mid 落在目标或其右侧,right = mid,注意此时不能跳过 mid。

文章配图

找右边界则相反,如果 mid 落在目标右侧,right = mid - 1;如果 mid 落在目标或其左侧,left = mid。为了避免死循环,mid 计算需向上取整。

文章配图

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.empty()) return {-1, -1};
        int left = 0, right = nums.size() - 1;
        int start = -1, end = -1;

        // 找左端点
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] >= target) right = mid;
            else left = mid + 1;
        }
        if (nums[left] == target) start = left;

        // 找右端点
        left = 0; right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left + 1) / 2;
            if (nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        if (nums[left] == target) end = left;

        return {start, end};
    }
};

搜索插入位置

如果目标不存在,需要返回它应该插入的位置。这其实也是寻找第一个大于等于目标值的位置。

文章配图

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] >= target) right = mid;
            else left = mid + 1;
        }
        return nums[left] < target ? left + 1 : left;
    }
};

旋转排序数组中的最小值

对于旋转过的有序数组,依然可以利用二分查找的特性。数组被分为两段递增序列,最小值位于转折点。我们可以通过比较 mid 与 nums[0] 的关系来判断 mid 落在哪一段。

文章配图

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0, right = nums.size();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] >= nums[0]) left = mid + 1;
            else right = mid;
        }
        return left == nums.size() ? nums[0] : nums[left];
    }
};

以上几种变体涵盖了二分查找在面试和实战中的主要应用场景。掌握边界条件的判断逻辑,比死记硬背模板更重要。

目录

  1. 二分查找算法原理与常见变体实战
  2. 算法原理与模板
  3. 基础查找
  4. 寻找目标范围
  5. 搜索插入位置
  6. 旋转排序数组中的最小值
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 动态代理原理与实现
  • Robot Lab 基于 Isaac Lab 的机器人强化学习使用指南
  • 高校 AIGC 检测新规解读:AI 率合格标准与应对策略
  • 微软发布 AutoDev AI 程序员,自主完成软件工程任务性能提升 30%
  • Seedance 2.0 重构 AIGC 工作流:语义理解与映射热更新实践
  • JavaScript 金额计算精度丢失与分摊方案
  • 前端实现 HTTPS 强制跳转与移动端域名自动适配
  • RabbitMQ 分布式系统实战:从安装部署到 C++ 调用
  • Flutter pathfinding 组件在 OpenHarmony 上的适配实战
  • 亲历者讲述程序员过度工作导致精神崩溃的原因
  • ik_llama.cpp 混合 GPU/CPU 推理与智能张量覆盖策略
  • IntelliJ IDEA 与 VS Code Git 标准操作规范
  • 解决 IDEA 运行 Maven 时出现的 JAVA_TOOL_OPTIONS 编码警告
  • 圣光艺苑:基于 Stable Diffusion 的鎏金画框艺术生成工具
  • 中文类 LLaMA 大语言模型资源整理与对比
  • OpenClaw 架构解析:从认知到行动的 AI 智能体实现
  • 面试高频缓存算法:LRU 与 LFU 原理及实现
  • Python 高性能编程中的缓存策略与实战
  • 华为 OD 技术面试真题:MySQL 核心原理与架构
  • 华为 OD 机试:停车场收入统计

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online