[Algorithm] Count occurrences of a number in a sorted array with duplicates using Binary Search

Let's say we are going to find out number of occurrences of a number in a sorted array using binary search in O(log n) time.

For example the given array is:

[1,1,3,5,5,5,5,5,9,11],

the number 5 appears 5 times;

the number 3 appears 1 time;

2 appears 0 times.

 

The idea:

we can use binary search twice, first time is to find first index of target number in the array; second is to find last index of given number in the array.

 

function count_numbers(ary, target) {
  function helper(ary, target, isFirst) {
    let start = 0;
    let end = ary.length - 1;
    let result = -1;
    while (start <= end) {
      let mid = Math.floor((start + end) / 2);
      if (ary[mid] === target) {
        result = mid;
        isFirst ? (end = mid - 1) : (start = mid + 1);
      } else {
        ary[mid] > target ? (end = mid - 1) : (start = mid + 1);
      }
    }

    return result;
  }

  const first = helper(ary, target, true);
  const last = helper(ary, target, false);

  if (first === -1 || last === -1) {
    return 0;
  }
  return last - first + 1;
}

console.log(count_numbers([1, 1, 3, 3, 5, 5, 5, 5, 5, 8, 11], 5)); // 5

 

转载于:https://www.cnblogs.com/Answer1215/p/10567475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值