题目描述
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3
返回值
4
解题思路
二分查找算法的变形
先找出中间坐标mid,判断array[mid]与key的大小
array[mid]>key:再去左边找
array[mid]<key:再去右边找
重点分析array[mid]=key的情况
这种情况下:它的左边和右边都有可能等于key的值
他们我们依次让左边坐标加一和右边坐标减一。直到左边和右边的元素都等于key。此时就可以利用下标直接计算出一共多少个key
要注意的特殊情况有两种:
如果数组长度为0,则返回0
当我们没找到元素时,也要返回0.要最后返回时分开考虑
java代码实现
10ms 9688kb
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0) return 0;//数组为空,直接返回
int left=0;
int right=array.length-1;
while(left<right){
int mid=left+(right-left)/2;
if(array[mid]<k){
left=mid+1;//去右边找
}
else if(array[mid]>k){
right=mid-1;//去左边找
}
else{
if(array[left]<k) left++;//左下标右移
if(array[right]>k) right--;//右下标左移
if(array[left]==k && array[right]==k) break;//全部是key是退出循环
}
}
if(array[left]==k){//确认全部是key的情况,否则就是没找到返回0
return right-left+1;
}
return 0;
}
}
京公网安备 11010502036488号