力扣小白刷题之34题在排序数组中查找元素的第一个和最后一个位置

题目描述

给定一个有序数组nums 和 目标值 target,找出目标值在数组中的开始位置和结束位置。如果不存在目标值,返回[-1, -1]。

思路

可以用二分查找找出第一个位置和最后一个位置,但是寻找的方法有所不同,需要实现两个二分查找。
可以将 寻找 target最后一个位置,转换成寻找target + 1 的第一个位置。这样我们只需要实现一个二分查找代码即可。
在寻找第一个位置(即左侧边界)的代码中,需要注意 right 的取值为 nums.length,而不是 nums.length - 1。 原因如下:

nums = [2, 2], target = 2

这个例子中,如果 right 取值为 nums.length - 1,那么 end = searchFirst(nums, target + 1) - 1 = 1 - 1 = 0。这是因为寻找左侧边界只会返回 [0, nums.length - 1] 范围的值。对于 searchFirst([2, 2], 3),我们希望返回 2 插入 nums 中的位置,也就是数组最后一个位置再往后一个位置,即 nums.length。所以我们需要将 right 取值为 nums.length,从而使得 searchFirst() 返回的区间更大,能够覆盖 target 大于nums 最后一个元素的情况。

代码

在这里插入图片描述

一个问题

需要考虑 first 和 end 谁大谁小吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值