【算法】寻找右侧边界的二分查找

寻找右侧边界的二分搜索是一种变体,它可以找到最后一个等于目标值的元素的位置。如果数组中不存在目标值,则返回-1。与寻找左侧边界的二分搜索类似,该算法的基本思想也是在每次迭代中将搜索范围缩小一半,直到找到目标元素或搜索范围为空为止。在寻找右侧边界时,如果中间元素等于目标值,则继续在右半部分搜索,否则在左半部分搜索。如果中间元素小于目标值,则在右半部分搜索,否则在左半部分搜索。这样可以保证最终找到的位置是最后一个等于目标值的元素的位置。与寻找左侧边界的二分搜索相比,寻找右侧边界的二分搜索只需要将判断条件稍作修改即可。

/**
 * 寻找右侧边界的二分查找
 */

// 这种方式取的区间是[left, right)
function rightBound1(nums, target) {
  if (nums.length === 0) {
    return -1;
  }
  let left = 0;
  let right = nums.length;

  while (left < right) {
    const mid = parseInt((left + right) / 2, 10);

    if (nums[mid] === target) {
      left = mid + 1;
    } else if (nums[mid] < target) {
      left = mid + 1;
    } else if (nums[mid] > target) {
      right = mid;
    }
  }

  return left - 1;
}

const nums1 = [1, 2, 2, 2, 3];
const target1 = 2;
console.log(rightBound1(nums1, target1));

// 这种方式取的区间是[left, right]
function rightBound2(nums, target) {
  let left = 0;
  right = nums.length - 1;

  while (left <= right) {
    const mid = parseInt((left + right) / 2, 10);

    if (nums[mid] === target) {
      left = mid + 1;
    } else if (nums[mid] < target) {
      left = mid + 1;
    } else if (nums[mid] > target) {
      right = mid - 1;
    }
  }

  if (right < 0 || nums[right] !== target) {
    return -1;
  }

  return right;
}

const nums2 = [1, 2, 2, 2, 3];
const target2 = 2;
console.log(rightBound2(nums2, target2));

该算法的时间复杂度为O(log n),比线性搜索更快。与寻找左侧边界的二分搜索相比,寻找右侧边界的二分搜索只需要将判断条件稍作修改即可。然而,该算法需要数组是有序的,如果数组无序,则需要先进行排序,这会增加时间复杂度。此外,该算法只适用于静态数组,如果数组需要频繁插入或删除元素,则需要使用其他数据结构。总的来说,寻找右侧边界的二分搜索与寻找左侧边界的二分搜索类似,都是高效的算法,但需要满足一定的前提条件才能发挥其优势。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

繁星召唤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值