查找优化

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

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

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

全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务