剑指 Offer 31 天打卡计划】#9 在排序数组中查找数字 I

64 阅读1分钟

题目

难度:⭐️⭐️

统计一个数字在排序数组中出现的次数。

示例

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

限制:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

题解

// 方法一
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let map = new Map()
    for(let num of nums){
        if(num===target){
            map.has(num) ? map.set(num, map.get(num)+1) : map.set(num, 1) 
        }
    }
    return map.get(target) ? map.get(target) : 0
};

// 方法二
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = 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
};


const binarySearch = (nums, target, lower)=>{
    let left = 0
    let right = nums.length-1
    let ans = nums.length

    while(left<=right){
        const mid = Math.floor((right+left)/2)
        if (nums[mid] > target || (lower && nums[mid] >= target)) {
            right = mid - 1;
            ans = mid;
        } else {
            left = mid + 1;
        }
    }
    return ans

}

笔记

因为数组有序,建议通过二分查找解决问题