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