[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