题目:统计一个指定的数在已排序数组中出现的个数
一个非常容易想到的办法就是当发现目标数字时开始计数,开始计数后遇到与目标数字不相等的数字时则停止计数并返回。当然此题的核心在于寻找目标数字的起始和终止点即可,因此完全可以想到使用二分查找的方法,代码如下
public class Solution {
private static int GetStartIndex(int[] array, int start, int end, int k){
if (start > end){
return -1;
}
int middle = (start + end)/2;
if (array[middle] == k){
// 当middle 与k相等时,我们需要判断它是不是k的起始点
// 如果是起点那么它的左边必然不等于k,或者middle本身就是0
if ((middle > 0 && array[middle-1] != k) || middle == 0){
return middle;
}
else{
// 否则说明k的起点在middle的左侧
end = middle - 1;
}
}
else if (array[middle] > k){
// 当k小于middle时,说明要在左边寻找
end = middle -1;
}
else{
start = middle + 1;
}
return GetStartIndex(array, start, end, k);
}
private static int GetEndIndex(int[] array, int start, int end, int k){
if (start > end){
return -1;
}
int middle = (start + end)/2;
if (array[middle] == k){
// 当middle 与k相等时,我们需要判断它是不是k的结束点
// 如果是终点那么它的右边必然不等于k,或者middle本身就是终点
if ((middle < array.length - 1 && array[middle+1] != k) || middle == array.length-1){
return middle;
}
else{
// 否则说明k的起点在middle的右侧
start = middle + 1;
}
}
else if (array[middle] > k){
// 当k小于middle时,说明要在左边寻找
end = middle -1;
}
else{
start = middle + 1;
}
return GetEndIndex(array, start, end, k);
}
public static int GetNumberOfK(int [] array , int k) {
// 使用二分查找的方法来解决
int res = 0;
if (array != null && array.length > 0){
int start = GetStartIndex(array, 0, array.length-1, k);
int end = GetEndIndex(array, 0, array.length-1, k);
if (start > -1 && end > -1){
res = end - start + 1;
}
}
return res;
}
}
本题是蛮简单的,这是我在租的小屋中写下的第一道题,主要是纪念一下哈哈