二分查找边界

查找左边界

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

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

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

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

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

查找右边界

那么如何查找最右一个 target 呢?最直接的方式是修改代码,替换在 nums[mid] == target 情况下的指针收缩操作

if(nums[mid] == target) {
	l = mid + 1;
}

实际上,我们可以利用查找最左元素的函数来查找最右元素,具体方法为:将查找最右一个 target 转化为查找最左一个 target + 1

查找完成后,指针 l 指向最左一个 target + 1(如果存在),而 r 指向最右一个 target因此返回 r 即可

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零壹寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值