跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

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

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

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

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

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

算法原理与模板

二分的本质不是简单的折半,而是根据目标值与中间值的比较关系,排除掉一半不可能包含目标的区间。针对不同需求(如找左端点、右端点),我们需要微调 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 {
:
    {
         (nums.())  {, };
         left = , right = nums.() - ;
         start = , end = ;

        
         (left < right) {
             mid = left + (right - left) / ;
             (nums[mid] >= target) right = mid;
             left = mid + ;
        }
         (nums[left] == target) start = left;

        
        left = ; right = nums.() - ;
         (left < right) {
             mid = left + (right - left + ) / ;
             (nums[mid] <= target) left = mid;
             right = mid - ;
        }
         (nums[left] == target) end = left;

         {start, end};
    }
};
public
vector<int> searchRange(vector<int>& nums, int target)
if
empty
return
-1
-1
int
0
size
1
int
-1
-1
// 找左端点
while
int
2
if
else
1
if
// 找右端点
0
size
1
while
int
1
2
if
else
1
if
return

搜索插入位置

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

文章配图

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. 旋转排序数组中的最小值
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 人工智能学习指南:零基础入门与大模型技术详解
  • Spring Cloud Gateway 统一服务入口实战指南
  • Label Studio 开源数据标注平台使用指南
  • FastGPT 结合 MCP 协议实现工具增强型智能体构建
  • 基于 OpenClaw 和 Claude 搭建自动化写作工作流
  • 国产大模型实测对比:文心一言、通义千问、Kimi 与豆包
  • LIBERO 开源机器人学习框架:架构解析与实战
  • 智元机器人三大产线及 5000 台量产里程碑
  • Node.js 与 npm 的安装与配置
  • 从零搭建个人云影院:PotPlayer 直连 Alist 实现云端流畅播放
  • MCP 插件配置指南:browser-tools-mcp 示例
  • 基于 Coze 抓取小红书视频并同步至飞书多维表实战
  • WebGIS 开发实战:WKT 转 GeoJSON 技巧与 Leaflet 加载
  • 2024 年前端主流框架技术总结与探索
  • Webman 框架:基于异步非阻塞架构的 PHP 高性能开发指南
  • Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查
  • 12 款主流 AIGC 检测与降重工具对比评测
  • 网络安全行业前景深度解析与入行路径建议
  • 昇腾 NPU 部署 Llama 2 模型:性能测试与实战优化
  • 数据结构初阶:二叉树的链式存储与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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