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

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

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

方法1:遍历,时间复杂度为O(n);

    public static int GetNumberOfK1(int [] array , int k){
        if(array.length==0){
            return 0;
        }
        int count=0;
        for(int i=0;i<array.length;i++){
            if(array[i]==k){
                count++;
            }
        }
        return count;
    }

方法2:利用二分查找,可以查找k-0.5和k+0.5的下标,做差。就是k在数组中出现的次数

    public static int GetNumberOfK2(int[] array,int k){
        return binSearch(array,k+0.5)-binSearch(array,k-0.5);
    }
    public static int binSearch(int[] array,double k){
        int start=0;
        int end=array.length-1;
        while(start<=end){
            int mid=start+((end-start)>>1);
            if(k<array[mid]){
                end=mid-1;
            }
            else{
                start=mid+1;
            }
        }
        return start;
    }

方法3:二分查找,用递归二分法找到第一个k和最后一个k,然后得到个数

    public static int GetNumberOfK3(int[] array,int k){
        int num=0;
        if(array.length==0){
            return 0;
        }
        int firstK=getFirstK(array,k,0,array.length-1);
        int lastK=getLastK(array,k,0,array.length-1);
        if(firstK>=0 && lastK>=0){
            num=lastK-firstK+1;
        }
        return num;
    }
    //找到第一个出现的数字的下标
    public static int getFirstK(int[] array,int k,int start,int end){
        while (start <= end) {
            int mid = start + ((end - start) >> 1);
            if (k <= array[mid])
                end = mid - 1;
            else
                start = mid + 1;
            }
        if (start < array.length && array[start] == k)
            return start;
        else
            return -1;
    }
    //找到最后一个出现的数字的下标
    public static int getLastK(int[] array,int k,int start,int end){
        while(start<=end){
            int mid=start+((end-start)>>1);
            if(k>=array[mid]){
                start=mid+1;
            }
            else{
                end=mid-1;
            }
        }
        if(end>=0 && array[end]==k){
            return end;
        }
        else
            return -1;
    } 
剑指Offer题解 文章被收录于专栏

剑指Offer-Java版本题解

全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
06-13 17:00
武汉大学 Java
6月了还有点击就送的offer吗😭,投麻了😢
叫我阿东就行:这个bg,也还没找到理想的工作吗?好难,好焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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