题目描述
给定一个有序数组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 谁大谁小吗?