当前位置: 首页 > 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.jsqmd.com/news/928246/

相关文章:

  • Web应用技术第一次和第二次作业
  • 无人机红外数据集 深度学习框架 无人机高空红外检测系统pyqt5界面 无人机高空红外数据集 无人机高空红外行人车辆检测数据集
  • 【多Agent 协作深度解析】Claude 官方 5 种协调模式的原理、选择与工程实践
  • 微服务架构(MSA)是如何诞生的?
  • 聊天机器人的搭建(一)
  • AI销售助理:1700万美元融资背后的技术架构与落地实践
  • AI内容运营成为大学生就业热门方向,越来越多年轻人开始学习AI营销
  • 单向循环链表超详细精讲 | 带头节点带头指针 + 完整可运行c语言代码
  • 车载AI Agent Harness:行车安全与交互管控
  • 生成式AI赋能无障碍开发:从设计到测试的实践指南
  • 波普尔主义百年灾难清单:系统性尸检报告
  • GPT-Image-2迭代亮点解析
  • 保姆级教程:在Ubuntu 20.04上从源码编译运行ORB-SLAM3(含ROS1/ROS2配置)
  • 设计模式深度解析:从六大原则到Spring源码,面试通关全攻略
  • 山东大学创新实训(六)--基于Multi-Agent的剧本杀平台博客
  • 第三周进度
  • 2026年最新厦门市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 2026年最新汕头市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 第五章:年终
  • Product Hunt 每日热榜 | 2026-05-31
  • 10. JavaArrayList 核心笔记
  • 扔掉塑料尺:给未来孤勇者的科学排毒指南
  • [分享]EssentialPIM安卓版(手机个人信息管理软件)
  • 告别静音!Windows 11系统声音保姆级配置指南(附完整音效清单与事件对照表)
  • 智慧火灾巡检-基于深度学习火灾烟雾识别系统,森林火灾识别系统。森林火灾检测 无人机森林火灾检测
  • 【周报】液冷板块集体跌停,但我在算一笔账
  • 【AI问答】GO代码循环返值
  • GHelper完整指南:华硕笔记本轻量控制神器的终极教程
  • 技术如何重塑人类感知与希望:算法、AR/VR与数据可视化的中介作用
  • 保姆级教程:用Python和PyTorch从零搭建一个行人重识别(ReID)原型系统