牛客剑指Offer-数字在升序数组中出现的次数
题目
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3
返回值
4
题解
第一种最简单的方法是O(n)复杂度。遍历数组统计结果。
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0){
return 0;
}
int len = array.length;
int count = 0;
for(int i=0;i<len;i++){
if(k==array[i]){
count++;
}
}
return count;
}
但是这种方法没用上有序数组的这个特点,说道有序数组
,首先想起来的是二分查找,因此可以利用二分查找找出第一个出现k的位置后最后出现k的位置,两者相减就是结果。
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0){
return 0;
}
return biSearch(array,k+0.5)-biSearch(array,k-0.5);
}
public int biSearch(int[] data, double num){
int s = 0, e = data.length-1;
while(s <= e){
int mid = (e - s)/2 + s;
if(data[mid] < num)
s = mid + 1;
else if(data[mid] > num)
e = mid - 1;
}
return s;
}