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

二分查找边界

二分查找边界

Q:给定一个长度为𝑛的有序数组nums ,其中可能包含重复元素。请返回数组中最左一个元素target的索引。若数组中不包含该元素,则返回−1 。

查找左边界

回忆二分查找插入点的方法,搜索完成后 𝑖 指向最左一个target因此查找插入点本质上是在查找最左一个target的索引。

考虑通过查找插入点的函数实现查找左边界。请注意,数组中可能不包含target ,这种情况可能导致以下两种结果。

  • 插入点的索引𝑖越界。
  • 元素 nums[i]target 不相等。

当遇到以上两种情况时,直接返回 −1 即可。

/* 二分查找最左一个 target */
int binarySearchLeftEdge(int[] nums, int target) {// 等价于查找 target 的插入点int i = binary_search_insertion.binarySearchInsertion(nums, target);// 未找到 target ,返回 -1if (i == nums.length || nums[i] != target) {return -1;}// 找到 target ,返回索引 ireturn i;
}

查找右边界

最直接的方式是修改代码,替换在nums[m] == target情况下的指针收缩操作。

/* 二分查找插入点(存在重复元素) */
int binarySearchInsertion(int[] nums, int target) {int i = 0, j = nums.length - 1; // 初始化双闭区间 [0, n-1]while (i <= j) {int m = i + (j - i) / 2; // 计算中点索引 mif (nums[m] < target) {i = m + 1; // target 在区间 [m+1, j] 中} else if (nums[m] > target) {j = m - 1; // target 在区间 [i, m-1] 中} else {i = m + 1; // 首个大于 target 的元素在区间 [m+1, j] 中}}// 返回插入点 jreturn j;
}

下面我们介绍两种更加取巧的方法

复用查找左边界

实际上,我们可以利用查找最左元素的函数来查找最右元素,具体方法为:将查找最右一个 target 转化为查找最左一个target + 1 查找完成后,指针𝑖 指向最左一个target + 1(如果存在),而 𝑗 指向最右一个target ,因 此返回𝑗 即可。

请注意,返回的插入点是𝑖 ,因此需要将其减 1 ,从而获得j

/* 二分查找最右一个 target */
int binarySearchRightEdge(int[] nums, int target) {// 转化为查找最左一个 target + 1int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);// j 指向最右一个 target ,i 指向首个大于 target 的元素int j = i - 1;// 未找到 target ,返回 -1if (j == -1 || nums[j] != target) {return -1;}// 找到 target ,返回索引 jreturn j;
}

转化为查找元素

我们知道,当数组不包含target 时,最终𝑖𝑗 会分别指向首个大于、小于target 的元素。

因此,我们可以构造一个数组中不存在的元素,用于查找左右边界。

  • 查找最左一个target :可以转化为查找target - 0.5 ,并返回指针 𝑖
  • 查找最右一个 target :可以转化为查找target + 0.5 ,并返回指针 𝑗

给定数组不包含小数,这意味着我们无须关心如何处理相等的情况。因为该方法引入了小数,所以需要将函数中的变量target改为浮点数类型(Python 无须改动)。

http://www.fuzeviewer.com/news/431/

相关文章:

  • 【CI130x 离在线】如何运行 curl 脚本
  • 这才是真正的AI NAS!极空间私有云Z2Ultra评测
  • 新东方第三节课名言作文
  • 十月阅读_3
  • 中考_体育
  • 常见问题处理 --- phpstudy启动mysql失败
  • 20232308 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 【密码学实战】openHiTLS PKCS12命令行程序: PKCS12文件生成与解析
  • 「CTSC2017-游戏」题解
  • vue3 vue3-form-element表单生成工具 输入框增加后缀
  • 20232402 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 掘金2025年:数字化商业浪潮下,如何选对平台与伙伴?一站式多商户商城系统推荐榜发布,多商户商城代理招募/多商户项目合伙人加盟/一站式开店代理项目加盟
  • 为医疗器械行业搭建“数字桥梁”,破解协同效率与合规难题
  • PostgreSQL 服务版
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025年10月办公家具公司评价榜:基于真实数据的权威推荐清单
  • vue+antv/x6项目使用问题
  • 《程序员修炼之道:从小工到专家》前五分之一观后感
  • 坐标系与投影关系
  • 用gdb的动态视角看ret2text的实现
  • 1027随笔
  • ask_skill
  • SVN 主分支合并之通过主分支合并子分支执行流程
  • 现代c++编程体验2
  • 化繁为简:解密国标GB28181算法算力平台EasyGBS如何以兼容性与易用性赋能安防集成
  • 计算机毕业设计springboot音乐畅听系统 基于Spring Boot框架的智能音乐播放系统编写 Spring Boot驱动的音乐在线欣赏平台构建
  • vue2 封装组件使用 v-mode【el-radio,el-input】
  • P11993 [JOIST 2025] 迁移计划 题解
  • ERP和CRM、SRM、MES之间的关系,怎么理解?
  • 2025年市面上氟碳铝单板品牌、市场氟碳铝单板公司、国内氟碳铝单板生产厂家、2025年氟碳铝单板品牌、口碑好的氟碳铝单板产品综合评测