题解 | #数字在升序数组中出现的次数#二分法

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

http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2

    public int GetNumberOfK(int [] array , int k) {
       if(array==null||array.length==0) return 0;
       //有序,想到二分,如何用二分来优化?
       //这是数组,如何确定某个数的个数?
       //由于有序,所以这个数出现的位置肯定是连续的,数组的好处在于下标,所以找到上下边界就可以使用下标
       //直接算出个数
       //上界:>=k的最左边,同样也是<k的最右边+1
       //下界:<=k的最右边
       //所以整一个函数,求<=k的最右边(leftEqlMaxRight)就可以了
       int res = leftEqlMaxRight(array,k) - leftEqlMaxRight(array,k-1);
       return res<0?0:res;//左边为负才需要管(没有k在数组中),右边为负没关系,表示0位置是k而已
    }
    public int leftEqlMaxRight(int[] array,int k){
        int l = 0;
        int r = array.length - 1;
        int target = -1;
        while(l<=r){
            int mid = ((r-l)>>>1)+l;
            if(array[mid]<=k){
                //标记,向右继续找
                target = mid;
                l = mid + 1;
            }else{
                r = mid - 1;
            }
        }
        return target;
    }
全部评论

相关推荐

10-10 16:30
济宁学院 Java
一表renzha:面试官:蓝桥杯三等奖?你多去两次厕所都能拿二等吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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