题目描述
统计一个数字在排序数组中出现的次数。
方法一
使用二分查找,找到这个数的下标i,然后统计i的前面有多少个这个数,再统计i的后面有多少这个数:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null || array.length==0) return 0;
if(k>array[array.length-1] || k<array[0]) return 0;
int L=0;
int R=array.length-1;
int mid = 0;
int count =0;
while(L<R){
mid = L +(R-L)/2;
if(array[mid]>k){
R=mid-1;
}else if(array[mid]<k){
L=mid+1;
}else{
break;
}
}
if(array[mid]!=k) return 0;
for(int i = mid-1;i>=0;i--){
if(array[i]==array[mid]){
count++;
}else{
break;
}
}
for(int i =mid+1;i<array.length;i++){
if((array[i]==array[mid])){
count++;
}else{
break;
}
}
return count+1;
}
}
方法二
使用二分查找,找到k-0.5应该插入的位置,和k+0.5的位置,这两个位置之间全部都是k
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null || array.length==0) return 0;
if(k>array[array.length-1] || k<array[0]) return 0;
int L = 0;
int R = array.length-1;
int index1 = getIndex(L,R,array,k-0.5);
int index2 = getIndex(index1,R,array,k+0.5);
return index2-index1;
}
public int getIndex(int L,int R,int[] arr,double k){
int mid = L;
while(L<=R){
mid = L +(R-L)/2;
if(arr[mid]>k){
R = mid-1;
}else {
L = mid+1;
}
}
return L;
}
}