题目内容 数字在排序数组中出现的次数
尝试一
结果:答案正确:恭喜!您提交的程序通过了所有的测试用例
代码:
public class Solution {
/*利用二分查找*/
public int GetNumberOfK(int [] array , int k) {
/* 特殊情况处理*/
if(array==null || array.length==0){
return 0;
}
/* 二分查找,确定第一个k出现的位置i*/
int i=-1;
i=binarySerach(0,array.length-1,array, k);
/* 从i向左右两边探测,看是否与k值相同,若相同count++*/
int count=0;
if(i!=-1){
/*向右探测*/
int l=i-1;
count=1;
while (++i<array.length && array[i]==k){
count++;
}
/*向左探测*/
while (l>-1 && array[l]==k){
count++;
l--;
}
}
/* 返回结果*/
return count;
}
private int binarySerach(int left,int right,int[] a,int k){
if(right<left){
return -1;
}
if(k==a[left]){
return left;
}
if(k==a[right]){
return right;
}
int m=(left+right)/2;
if(k==a[m]){
return m;
}
else if(k<a[m]){
return binarySerach(left+1,m-1,a,k);
}else{
return binarySerach(m+1,right-1,a,k);
}
}
}
分析:二分查找,找到k首次出现的位置,然后向两边探测。
总结
- 二分查找,适合用来查找某个东西是否在有序的序列中。
- 二分查找,注意递归结束标识
left<right、right==x、left==x、midle==x
.