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

二分查找法实例应用的细节分析

细节二:

搜索时选定新边界,新边界的值是mid ± 1还是mid

在进行一次搜索判断之后,查找新边界时,新边界一般有两种选择(以right为例)

  • right = mid - 1
  • right = mid

按照标准的二分查找框架,这两种赋值方式的区别是新区间是否还要包括mid这个点。

一般来说选择新边界时,其实已经对mid这个值已经判断过了,秉持着最大程度地缩小搜索区间的理念,按理说应该要将mid这个点在新区间排除掉的;

但联系上一个问题,如果判断条件是left < right,那么搜索区间是左闭右开区间,即使right = mid,也不会判断mid;但是如果right = mid - 1,那么就会少判断right = mid - 1这个点,所以这里新区间的边界为right = mid

所以这里的缩小区间表示式是和判断条件联系在一起的,需要考虑实际情况,然后再进行判断

尽管二分查找有统一的框架模板,操作步骤;但二分查找不是一种框架模板,而是一种思想

案例

  1. 当数组中含有多个目标数字
  • 查找最左边目标数字的索引
  • 查找最右边目标数字的索引

2. 当数组中不含有目标数字

    • 查找目标数字的插入位置

搜索边界

集合中含有多个符合要求的解,查找左边界或者右边界

e.g.

  • 按照全闭区间查找查找左右边界的关键是nums[mid] == target时,如何划定新区间。

如果查找左边界:

int binarySearch(vector<int>& nums,int target) { int n = nums.size(); int left = 0,right = n - 1; int ans = -1; while(left <= right){ int mid = left + (right - left) / 2; if (nums[mid] == target){ // 这里能判断出 mid 可能是左边界,但是对于 mid - 1 我们是无法判断的,所以 ans = mid; right = mid - 1; }else if (nums[mid] > target) { right = mid - 1; }else { left = mid + 1; } } return ans; }

最终结果都是ans。在每一次判断(nums[mid] == target)中,我们只能判断出mid是符合要求的,而无法判断出mid - 1或者mid + 1是否符合要求,所以ans = mid

按照这个思路中,其实也可以不采用 ans 这个变量,而采用right + 1或者left - 1的形式,因为right + 1或者left - 1等于mid,不过这需要进一步判断right + 1或者left - 1是否在数组范围内

如果你将nums[mid] == targetnums[mid] > target或者nums[mid] < target合并起来,你还需要判断nums[left - 1]或者nums[right + 1]是否等于target,因为当nums[mid] > target或者nums[mid] < target时,也会给ans赋值。

http://www.zskr.cn/news/1402593.html

相关文章:

  • 程序员如何在AI时代保持竞争力:2026年的生存指南
  • 2026年4月国内优秀的工业冷却塔公司推荐,冷却塔/方形逆流冷却塔/冷却塔填料/圆形逆流冷却塔,工业冷却塔订制厂家推荐 - 品牌推荐师
  • 从Hubel Wiesel到MViT:视觉Transformer如何‘抄袭’了大脑的层次化处理?
  • 融合SOA与语义Web的智能家居系统:从感知到认知的架构实践
  • 三步打造你的职业围棋AI分析助手:LizzieYzy完整使用指南
  • 金华黄金回收六强实力解析:福昌夏领跑上门高价榜 - 黄金上门回收
  • QuickLook.Plugin.OfficeViewer-Native:Windows用户必备的Office文件快速预览终极方案
  • 5分钟解锁专业级法线贴图:零门槛在线工具完全指南
  • 如何用pk3DS轻松打造个性化宝可梦游戏:完整指南与实战教程
  • 多人协作表格哪个好用?2026年最新工具答案来了
  • SF6综合测试仪:国产替代SF6综合测试仪的精密化进阶与自主实践
  • 边缘物联网节点容器化能耗实测:Docker在电池供电场景下的代价与优化
  • 国际机票代理哪家强?实测3家龙头:第一名武汉圣擎,售后无人能及! - 土星买买买
  • 3分钟解锁网易云音乐NCM加密文件:ncmdump终极解密指南
  • 3个被忽略的习惯断点,正在悄悄废掉你的ChatGPT生产力:即刻启用「Prompt-Action-Review」三阶追踪表
  • 实战解析——基于硬布线控制的24指令单周期MIPS CPU核心设计
  • 避开蒙特卡洛仿真的巨量计算:用LTSpice几步实现高效的最坏情况分析
  • ARM架构系统寄存器CTR与DACR深度解析
  • STM32CubeMX实战:独立看门狗(IWDG)配置与超时计算全解析
  • STM32CubeMX实战指南:定时器中断精准控制与多场景应用
  • 未来荧黑字体:3分钟学会中文设计字体安装与配置的终极指南
  • 暗黑破坏神2存档编辑器d2s-editor终极指南:快速掌握角色管理工具
  • 告别格式混乱:手把手教你用LaTeX的\appendix和\appendices命令搞定IEEE论文附录
  • 终极指南:3秒破解百度网盘提取码,让资源获取不再卡顿
  • Jetson Nano上YOLOv5+TensorRT加速,从环境搭建到摄像头实时检测的保姆级避坑指南
  • 毕业答辩高效通关:用百考通AI 30分钟搞定专业答辩PPT
  • 别再手动导数据了!用SeaTunnel 2.3.1把Hive数据自动同步到StarRocks(附完整配置文件)
  • 决策反馈辅助已知干扰消除:强信号下提升通信可靠性的迭代算法
  • 【力扣100题】54.最长公共子序列
  • Pycharm与Xshell联袂出击:一站式远程Python开发环境搭建指南