JZ37-数字再升序数组中出现的次数
题目:统计一个数字在升序数组中出现的次数。
解题思路:既然是有序数组,先使用二分查找找出随意一个当前k值的位置,剩余如果有相同的一定在k位置的前后;这样就先找到k坐标index,在index以及之前找看有多少个k值,再继续找index之后有多少k值,计算出k值的总数量。
/**
* @author 枫叶火火
*/
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//边界值判定
if(array == null || array.length == 0){
return 0;
}
//获取查找到的下表值
int index = binarySearch(array, 0, array.length-1, k);
//查找到该值计算前后的数量
if(index != -1){
return Count(array,index);
}
return 0;
}
//二分查找k值所在的下标值
private int binarySearch(int [] array, int start, int end, int k){
if(start > end){
return -1;
}
int mid = start + (end - start) / 2;
if(k < array[mid]){
return binarySearch(array, start, mid-1, k);
}else if(k > array[mid]){
return binarySearch(array, mid+1, end, k);
}else{
return mid;
}
}
//计算k的数量
private int Count(int[] array, int index){
//k的值
int k = array[index];
//数量
int count = 0;
//当前坐标
int i = index;
//向前查询k
while(i >= 0 && array[i] == k){
count++;
i--;
}
//修改当前坐标
i = index + 1;
//向后查询k
while(i<array.length && array[i] == k){
count++;
i++;
}
return count;
}
}