查找优化
数字在排序数组中出现的次数
http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2
对于数据量比较小的数据可采用:
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; } }
有些细节还需要去推敲,大体思路应该没错,欢迎大佬批评指正