剑指offer_53_在排序数组中查找数字I【javascript】

72 阅读1分钟

题目链接

leetcode.cn/problems/za…

题目 数字在排序数组中出现的次数【简单】

统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

示例

示例 1:
输入: nums = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4
输出: 3

示例 2:
输入: nums = [1, 2, 3, 5, 7, 9], target = 6
输出: 0

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109
  • 注意:本题与 34 题相同(仅返回值不同):leetcode-cn.com/problems/fi…

题解

二分查找

  • 时间复杂度: O(log⁡n) ,其中 n 为数组的长度。二分查找的时间复杂度为 O(logn),一共会执行两次,因此总时间复杂度为 O(logn)。
  • 空间复杂度:O(1) 。只需要常数空间存放若干变量。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
const binarySearch = (nums, target, lower) => {
    let left = 0, right = nums.length - 1, ans = nums.length;
    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (nums[mid] > target || (lower && nums[mid] >= target)) {
            right = mid - 1;
            ans = mid;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

var countTarget = function(nums, target) {
    let ans = 0;
    const leftIdx = binarySearch(nums, target, true);
    const rightIdx = binarySearch(nums, target, false) - 1;
    // if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] === target && nums[rightIdx] === target) {
    ans = rightIdx - leftIdx + 1;
    // } 
    return ans;
};