查找优化

数字在排序数组中出现的次数

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;
                }
            }

有些细节还需要去推敲,大体思路应该没错,欢迎大佬批评指正

全部评论

相关推荐

05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务