正文
当数组中存在重复元素时,如果我们需要寻找目标元素出现的最后一次索引位置(最右侧边界),或者目标不存在时其应插入的位置,需要使用以下变体。
算法模板
1 | fun searchRightBound(nums: IntArray, target: Int): Int { |
使用说明
核心逻辑:
- 关键在于
nums[mid] <= target时执行left = mid + 1。即使找到了目标,我们也并不立即返回,而是继续收缩左边界,试图在右侧寻找最后一次出现的目标。 - 循环结束后,
right指向的是最后一个等于target的元素索引。
- 关键在于
适用场景:
- 查找有序数组中最后一个等于
target的元素。 - 查找最后一个小于等于
target的元素(Upper Bound 变体)。 - 统计重复元素的范围(配合左边界模板)。
- 查找有序数组中最后一个等于
注意点:
- 返回值
right的范围是[-1, nums.size - 1]。如果target比数组所有元素都小,right将为-1。 - 检查是否存在时,务必先判断
right >= 0。 left的最终位置是第一个大于target的元素位置。
- 返回值