JS版剑指offer-数字在升序数组中出现的次数

296 阅读1分钟

描述

给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数 数据范围:0≤n≤1000,0≤k≤100,数组中每个元素的值满足 0≤val≤100

示例

输入:[1,2,3,3,3,3,4,5],3

返回值:返回值4

方法一

解题思路

查找数组中某个目标,不管数组是否有序,直接遍历一遍即可。

代码实现

function GetNumberOfK(data, k)
{
    let val = 0
    for(let i = 0;i<data.length;i++){
        if(data[i] === k) {
            ++val
        }
    }
    return val
}

 时间复杂度:O(N);空间复杂度:O(1)

方法二

解题思路

因为是有序的所以我们通常会想到使用二分法,目标值有多个一定是连在一起的。我是可以在有序数组中查找任意一个值,因此我们只需要找到左边界和右边界,然后相减既得出出现次数。

左边界:如果存在目标值,则指向第一个目标值,否则,如果不存在,则指向大于目标的第一个值。

右边界:不管目标值存在与否,都指向大于目标值的第一个值。

function GetNumberOfK(data, k)
{
    if(data.length == 0) return 0
    let first = 0
    let last = data.length
    while(last > first){
        let mid =first + Math.floor((last - first) / 2)
        if(data[mid] < k){
            first = mid + 1
        } else {
            last = mid
        }
    }
    let left = first
    
    first = 0
    last = data.length
    while(last > first){
        let mid =first + Math.floor((last - first) / 2)
        if(data[mid] > k){
            last = mid
        } else{
            first = mid + 1
        }
    }
    let right = last
    return right-left
}