查找优化

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

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

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

全部评论

相关推荐

前辈们好!晚辈是一名在读硕士生,研究方向是计算机视觉、6D位姿估计、手术导航。按照目前的简历水平,请问能否够得着一些互联网大厂的实习面试资格呢,可以申请哪些类型的岗位呀?在考虑算法工程师,但是相比于计算机科班的同学,自己的项目经历还有刷题似乎有些薄弱了。简历还可以在哪些方面进行修改呢?提前感谢大家!
神哥不得了:神哥过年也来解答啦,简历这样写提升空间很大呀,算法的话要求顶刊顶会,如果有的话就会比较好找,看不出来你这两个是不是顶刊顶会,这些课题的话,对找工作帮助没有那么大,如果走算法的话应该会比较难,但是也不是完全没机会的状态
点赞 评论 收藏
分享
找不到工作死了算了:你已经熟练掌握c语言啦,可以投简历参加秋招了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务