思路很简单 :就是利用二分法寻找第一个K出现的地方和最后一个K出现的地方
public class GetNumberOfK1 {
public int GetNumberOfK(int [] array , int k) {
int len=array.length;
int count=0;
if(array!=null&&len>0){
int firstK=findFirstK(array,k,0,len-1);
int lastK=findLastK(array,k,0,len-1);
if(firstK>-1&&lastK>-1){
count+=(lastK-firstK+1);
}
}
return count;
}
private int findFirstK(int[] a, int k,int l, int r) {
if(l>r){
return -1;
}
int mid=(l+r)/2;
if(k==a[mid]){
if(mid==0||(mid>0&&a[mid-1]!=k)){
return mid;
}else{
r=mid-1;
}
}else if(k>a[mid]){
l=mid+1;
}else{
r=mid-1;
}
return findFirstK(a,k,l,r);
}
private int findLastK(int[] a, int k,int l, int r) {
if(l>r){
return -1;
}
int mid=(l+r)/2;
if(k==a[mid]){
if(mid==a.length-1||(mid<a.length-1&&a[mid+1]!=k)){
return mid;
}else{
l=mid+1;//此处一定要注意 !!!
}
}else if(k>a[mid]){
l=mid+1;
}else{
r=mid-1;
}
return findLastK(a,k,l,r);
}
public static void main(String[] args) {
GetNumberOfK1 m1 = new GetNumberOfK1();
int nums[] = new int[]{1, 2, 3, 3, 3, 3, 4, 5};
int count = m1.GetNumberOfK(nums, 3);
System.out.println(count);
}
}