news 2026/5/23 18:43:11

二分查找算法:高效搜索的核心技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分查找算法:高效搜索的核心技巧

一、二分查找核心原理

有序数组中,不断取中间值对比目标值,每次舍弃一半区间,快速缩小查找范围。

  • 适用前提:数组单调递增 / 递减
  • 优势:海量数据查找效率远高于遍历
  • 核心变量:左边界 left、右边界 right、中间下标 mid

二、基础二分模板(查找单个目标值)

#include <iostream> #include <vector> using namespace std; // 查找目标值,存在返回下标,不存在返回-1 int binarySearch(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while(left <= right) { int mid = left + (right - left) / 2; // 防溢出写法 if(nums[mid] == target) { return mid; } else if(nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; }

三、两大边界模板(高频考题)

模板 1:查找左边界(重复元素取最左侧位置)

int leftBound(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 - 1; else left = mid + 1; } // 校验下标合法性与数值匹配 if(left >= nums.size() || nums[left] != target) return -1; return left; }

模板 2:查找右边界(重复元素取最右侧位置)

int rightBound(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) left = mid + 1; else right = mid - 1; } if(right < 0 || nums[right] != target) return -1; return right; }

四、mid 防溢出说明

常规写法(left+right)/2,数值过大易整型溢出最优写法:left + (right-left)/2,运算安全等价

五、经典实战例题

例题 1:搜索目标元素范围

输入有序数组,返回目标值起始、结束下标

vector<int> searchRange(vector<int>& nums, int target) { int l = leftBound(nums, target); int r = rightBound(nums, target); return {l, r}; }

例题 2:搜索插入位置

有序数组,找到目标插入下标,保持数组有序

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) return mid; else if(nums[mid] < target) left = mid + 1; else right = mid - 1; } return left; }

六、二分查找适用场景

  1. 有序数组元素查找、统计重复个数
  2. 旋转有序数组搜索
  3. 找极值、分割区间
  4. 平方根计算、数值判定类题型
  5. 大数据量查询优化

七、核心边界易错点

  1. 循环条件left <= rightleft < right混用,区间截断错误
  2. 左右边界更新mid±1漏写,造成死循环
  3. 重复元素场景,误用基础模板无法取边界
  4. 查找结束后,未校验下标越界

八、模板选用口诀

  1. 唯一元素精准查找 → 基础模板
  2. 重复元素找最先出现位置 → 左边界模板
  3. 重复元素找最后出现位置 → 右边界模板
  4. 无序数组严禁使用二分查找

九、今日总结

  1. 二分依赖有序性,时间复杂度\(O(logn)\)
  2. 熟记基础、左边界、右边界三套模板
  3. mid 采用安全写法,规避数值溢出
  4. 边界判断是刷题失分核心点,区分不同场景套用模板
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 18:42:57

【国家级智慧教育示范区验证成果】:1个AI知识管理模型如何让区域教研协同响应速度从72小时压缩至11分钟

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI知识管理在教育领域的应用 AI知识管理正深刻重塑教育生态&#xff0c;通过语义理解、知识图谱构建与个性化推荐等能力&#xff0c;将碎片化教学资源转化为结构化、可推理、可演化的智能知识体。教师可…

作者头像 李华
网站建设 2026/5/23 18:37:15

告别硬编码!用Verilog为FPGA驱动的WS2812B点阵设计一个图形动画引擎

基于FPGA的WS2812B图形动画引擎设计实战 在LED点阵显示领域&#xff0c;硬编码实现图形动画不仅效率低下&#xff0c;更难以维护和扩展。本文将分享如何用Verilog为FPGA驱动的WS2812B点阵构建一个可复用的图形动画引擎&#xff0c;通过模块化设计实现复杂动态效果。 1. 传统硬…

作者头像 李华
网站建设 2026/5/23 18:33:12

Termux运行Nethunter:无Root安卓渗透环境搭建与实战

1. 这不是“装个Kali”那么简单&#xff1a;Termux里跑Nethunter的本质是什么&#xff1f;很多人看到“Nethunter-In-Termux”第一反应是&#xff1a;“哦&#xff0c;手机上装个Kali Linux&#xff1f;”——这理解偏差得有点远。它既不是在Android上虚拟化一个完整Linux发行版…

作者头像 李华
网站建设 2026/5/23 18:32:03

暗黑2存档修改终极指南:5分钟学会免费d2s文件编辑器

暗黑2存档修改终极指南&#xff1a;5分钟学会免费d2s文件编辑器 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2的d2s存档编辑器是一款专为玩家设计的强大工具&#xff0c;让你能够轻松修改角色属性、管理装备和调整…

作者头像 李华