描述
给定一个长度为 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
}