对于数据量比较小的数据可采用:
int mid = Arrays.binarySearch(array, k);
if(mid<0) return 0;
int cnt = 1;
for(int i=mid+1; i < array.length && array[i]==k;i++)
cnt++;
for(int i=mid-1; i >= 0 && array[i]==k;i--)
cnt++;
return cnt;对于数据量比较大的数据可继续利用二分法进行优化:
比如:0 1 2 2 3 3 4 5 5 5 5 5 6 7 8 9 12 13 14
k=5
以左边为例:
int leftmid = mid;//定义左侧数组大指针
int left =0;//定义左侧数组小指针
int temp = 0;//存储前一个left
int start = 0;//记录第一个出现k的位置索引
//处理左边
while(true){
if(array[left]!=k){//移动left指针
int s = (leftmid+left)/2;
if(array[s]==k) temp = left;//
left = s;
}else{//移动leftmid指针,此处借助temp恢复left指针
leftmid = left;
left = temp;
}
if((leftmid-left)==1){//两个指针碰到一起,此时leftmid就是第一个出现5的位置
start = leftmid;
break;
}
}有些细节还需要去推敲,大体思路应该没错,欢迎大佬批评指正



京公网安备 11010502036488号