题目描述
统计一个数字在排序数组中出现的次数。
思路
- 采用二分的思路分别查找k在数组中的第一个和最后一个的位置,下标相减加1就可得到k出现次数。
- 在二分查找中,当查找到k值时,GetFistOfK和GetLastOfK分别向前和向后查找下一个直到值不等于k,返回找到的下标值。
示例代码
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0){
return 0;
}
int res=0;
int len=array.length;
int l=GetFistOfK( array , k,0 , len-1);
int r=GetLastOfK(array , k,0 ,len-1 );
if(l>=0&&r>=0){
res=r-l+1;
}
return res;
}
public int GetFistOfK(int [] array , int k,int l,int r) {
if(l>r||l<0||r<0){
return -1;
}
int mid=(l+r)/2;
if(array[mid]==k){
int t=mid;
while(t>=0&&array[t]==k){
t--;
}
return ++t;
}else if(array[mid]<k){
return GetFistOfK(array , k, l, mid-1);
}else{
return GetFistOfK(array , k, mid+1, r);
}
}
public int GetLastOfK(int [] array , int k,int l,int r) {
if(l>r||l<0||r<0){
return -1;
}
int mid=(l+r)/2;
if(array[mid]==k){
int t=mid;
while(t<array.length&&array[t]==k){
t++;
}
return --t;
}else if(array[mid]<k){
return GetLastOfK(array , k, l, mid-1);
}else{
return GetLastOfK(array , k, mid+1, r);
}
}
}