//参考剑指offer思路,先找到第一个索引找到第二个索引
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0){
return 0;
}
int result=0;
if(findLast(array,0,array.length-1,k)>-1&&findFirst(array,0,array.length-1,k)>-1){
result=findLast(array,0,array.length-1,k)-findFirst(array,0,array.length-1,k)+1;
}
return result;
}
//找到第一个索引的函数
public static int findFirst(int[] array,int start,int end,int k){
//边界条件
if(start>end){
return -1;
}
int midIndex=(start+end)/2;
//中间索引值刚好等于K时
if(array[midIndex]==k){
//判断是第一个吗
//这里有个坑,先判断(midIndex-1)>=0再array[midIndex-1]!=k,不然会出现数组越界
//下同
if(((midIndex-1)>=0&&array[midIndex-1]!=k)||midIndex==0){
return midIndex;
}else{
end=midIndex-1;
}
//中间索引值刚好大于K时
}else if(array[midIndex]>k){
end=midIndex-1;
}else{
start=midIndex+1;
}
return findFirst(array,start,end,k);
}
//找到最后一个索引的函数
private static int findLast(int[] array,int start,int end,int k){
//边界条件
if(start>end){
return -1;
}
int midIndex=(start+end)/2;
if(array[midIndex]==k){
//判断是最后一个吗
if(((midIndex+1)<array.length&&array[midIndex+1]!=k)||midIndex==array.length-1){
return midIndex;
}else{
start=midIndex+1;
}
}else if(array[midIndex]<k){
start=midIndex+1;
}else{
end=midIndex-1;
}
return findLast(array,start,end,k);
}
}时间复杂度与二分查找的相同:O(logn)
空间复杂度为O(1)

京公网安备 11010502036488号