题目描述
统计一个数字在排序数组中出现的次数。
思路一:
暴力求解,遍历,累加和k值相等的个数。
public int GetNumberOfK(int [] array , int k) {
if(array.length == 0) return 0;
int res = 0;
for(int i=0;i<array.length;i++){
if(array[i] == k)
res++;
if(array[i] > k)
return res;
}
return res;
}
思路二:
先用二分查找找到k值的一个位置,之后再计算k值前后和k值相同的个数。
//先用二分法找到对应的k值的位置,之后再计算k值前后和k值相同的个数
public int GetNumberOfK(int [] array , int k) {
int index = binaryFind(array, 0, array.length-1, k);
if(index == -1) return 0;
int res = 1;
int pre = index,rear = index;
while(--pre>=0) {
if(array[pre]==k)
res++;
else
break;
}
while(++rear<=array.length-1) {
if(array[rear]==k)
res++;
else
break;
}
return res;
}
//二分查找
private int binaryFind(int[] array, int start, int end, int k){
if(start>end) return -1;
while(start<=end){
int mid = (start+end)/2;
if(array[mid] == k) return mid;
else if(array[mid] > k)
end = mid - 1;
else
start = mid + 1;
}
return -1;
}