题目描述
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3返回值
4
思路
看见有序,肯定就是二分查找了
1、利用二分查找找到等于key值的地方mid
2、从mid开始往前找,找到第一个等于key的地方
3、从mid开始往后找,找到最后一个等于key的地方
代码
function GetNumberOfK(data, k)
{
// write code here
let left = 0;
let right = data.length - 1;
let mid = left + Math.floor((right - left) / 2);
//1、利用二分查找找到等于key值的地方mid
while(data[mid] !== k && left <= right){
if(data[mid] < k){
left = mid + 1;
}else{
right = mid - 1;
}
mid = left + Math.floor((right - left) / 2);
}
if(left > right){
return 0;
}
let new_left = mid;
let new_right = mid;
//2、从mid开始往前找,找到第一个等于key的地方
while(data[new_left] === k && new_left >= 0){
new_left -= 1;
}
//3、从mid开始往后找,找到最后一个等于key的地方
while(data[new_right] === k && new_right < data.length){
new_right += 1;
}
return new_right - new_left - 1;
}
运行环境:Javascript_V8
运行时间:11ms
占用内存:5332KB