当前位置: 首页 > news >正文

二分查找模板(binary_search)

大家好啊!二分查找是一个很常见的问题,也许大家认为很简单,但是二分查找毕竟可以分为对于递增(不递减)数组,递减(不递增)数组查找不大于,小于,不小于,大于共八种情况,而我们接触到的库函数upper_bound和lower_bound也仅仅只包含两种情况罢了。

如果你常常像我一样为二分查找的条件以及返回值而头昏眼花的话,那么就请看看这篇帖子吧,如果有错误的话欢迎指正~~~


目录

一、何为二分查找?

二、表示二分查找的三种区间选择

三、二分查找

模板:

口诀:

详细代码:

(1)递增(非递减,从小到大)数组

(2)递减(非递增,从大到小)数组

四、结语


一、何为二分查找?

二分查找一般指的是在一个有序数组中,通过不断将搜索范围缩小一半来高效定位某个特定目标值的方法。

核心思想:分治(Divide and Conquer);

时间复杂度:O(nlog n);

空间复杂度:O(1)。

二、表示二分查找的三种区间选择

对于二分查找,我们需要取一个左值left和一个右值right,在区间选择上有三种:[left, right],[left, right), (left, right),这三种取法区别在于:

  1. 初始边界设定leftright的取值)
  2. 循环条件while的判断)
  3. 边界更新方式leftright的调整)

我更习惯使用第一种,也就是闭区间[left, right],并且返回值为下标,其他两种就不做讲解。

三、二分查找

模板:

int binary_search_template(int arr[], int target) { int lefft = 0, right = arr.size() - 1; while(left <= right) { int mid = left + (right - left) / 2; //防止越界 if (/*情况特定条件*/) ...... else ...... } return /*返回值*/ }

口诀:

情况特定条件:针对于arr[mid]与target的比较,若不大于(<=),小于(<),不小于(>=),大于(>);

返回值:若为第一个要寻找的值则为left,若为最后一个要寻找的值则为right(需要理解)。

省略号部分:else下面的与返回值统一,若返回值为left,else下则为left = mid + 1,反之。

详细代码:

(1)递增(非递减,从小到大)数组

// 递增数组:找不大于target的最大数 int binary_search_1(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; } //一般情况直接返回(不大于target的最后一个数) return right; } // 递增数组:找小于target的最大数 int binary_search_2(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; } //一般情况直接返回(小于target的最后一个数) return right; } // 递增数组:找不小于target的最小数 int binary_search_3(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; } //一般情况直接返回(不小于target的第一个数) return left; } // 递增数组:找大于target的最小数 int binary_search_4(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; } //一般情况直接返回(大于target的第一个数) return left; }

(2)递减(非递增,从大到小)数组

// 递减数组:找不大于target的最大数 int binary_search_5(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; } //一般直接返回(不大于target的第一个数) return left; } // 递减数组:找小于target的最大数 int binary_search_5(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; } //一般直接返回(小于target的第一个数) return left; } // 递减数组:找不小于target的最小数 int binary_search_5(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; } //一般直接返回(不小于target的最后一个数) return right; } // 递减数组:找大于target的最小数 int binary_search_5(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; } //一般直接返回(大于target的最后一个数) return right; }

四、结语

本篇仅仅作为模板使用,不做其他讲解,希望能够帮助大家,如果有发现错误请及时指正!!!

备注:此篇内容均为原创,代码是经过较为仔细地学习之后自己总结各路写法得到,如果内容有什么错误欢迎指正!

http://www.gsyq.cn/news/1439578.html

相关文章:

  • AI内容运营成为大学生就业热门方向,越来越多年轻人开始学习AI营销
  • 【多Agent 协作深度解析】Claude 官方 5 种协调模式的原理、选择与工程实践
  • 车载AI Agent Harness:行车安全与交互管控
  • 生成式AI赋能无障碍开发:从设计到测试的实践指南
  • GPT-Image-2迭代亮点解析
  • 第三周进度
  • 山东大学创新实训(六)--基于Multi-Agent的剧本杀平台博客
  • Product Hunt 每日热榜 | 2026-05-31
  • 扔掉塑料尺:给未来孤勇者的科学排毒指南
  • 【周报】液冷板块集体跌停,但我在算一笔账
  • 【AI问答】GO代码循环返值
  • GHelper完整指南:华硕笔记本轻量控制神器的终极教程
  • 技术如何重塑人类感知与希望:算法、AR/VR与数据可视化的中介作用
  • 第六章:觉醒
  • 礼盒定制避坑指南!新手品牌常见问题总结
  • AI Agent 浏览器任务遇到安全验证时,如何设计暂停与人工复核流程
  • 如何利用Seraphine智能助手提升英雄联盟游戏体验:5个实战场景终极指南
  • 数据结构从零开始③:栈和队列——操作受限的线性表,一篇搞懂
  • mongodb数据库服务器内存过高分析处理
  • 企业资产管理软件选型全攻略:选对不选贵,落地是核心
  • 构建实时事件驱动AI预测系统:从流处理到模型服务的架构实践
  • 3分钟掌握Codeforces实时评分预测:Carrot浏览器扩展深度解析
  • Node.js技术周刊 2026年第20周
  • 2026 江苏扬州市(全区域服务)本地人必选彩钢瓦金属屋面防水防腐公司避坑指南 TOP5 推荐 - 本地便民网
  • MATLAB雷达CFAR检测实操包:CA-CFAR算法仿真+参数调优视频讲解
  • 二维材料薄片自动化处理:机器学习与光学显微镜结合方案
  • 孤独数据:人的一生,绝大部分时间都是独自一人
  • 深州GEO优化公司|企业知识库升级维护,深州AI搜索优化服务商选择指南 - 招财兔数字员工
  • 涿州GEO优化公司|企业知识库升级维护,涿州AI搜索优化服务商选择指南 - 招财兔数字员工
  • 乐清虹桥家长亲测:双语幼儿园的真实品质标尺 - 奔跑123