题目描述
统计一个数字在排序数组中出现的次数。
算法解析:
最直观的解法,就是从头到尾扫描整个排序数组,但是对于排序数组的话,如果我们使用二分法的话,应该会起到意想不到的结果,但是既然是有多个相同的数字,那么我们可以利用二分法查找第一个k和最后一个k,然后就可以找出出现的次数。
代码如下:
public int GetNumberOfK(int [] array , int k) {
int number = 0;
if (array != null && array.length > 0){
int firstK = getFirstK(array, k, 0, array.length - 1);
int lastK = getLastK(array, k, 0, array.length - 1);
if (firstK > -1 && lastK > -1){
number = lastK - firstK + 1;
}
}
return number;
}
private int getLastK(int[] array, int k, int start, int end) {
if (start > end){
return -1;
}
int mid = (start + end) >> 1;
if (array[mid] == k){
if ((mid < array.length - 1 && array[mid + 1] != k) || mid == array.length - 1){
return mid;
}else {
start = mid + 1;
}
}else if (array[mid] < k){
start = mid + 1;
}else{
end = mid - 1;
}
return getLastK(array, k, start, end);
}
private int getFirstK(int[] array, int k, int start, int end) {
if (start > end){
return -1;
}
int mid = (start + end) >> 1;
if (array[mid] == k){
if ((mid > 0 && array[mid - 1] != k) || mid == 0){
return mid;
}else {
end = mid - 1;
}
}else if (array[mid] > k){
end = mid - 1;
}else{
start = mid + 1;
}
return getFirstK(array, k, start, end);
}