首页 > 其他分享 >【剑指Offer】37、数字在排序数组中出现的次数

【剑指Offer】37、数字在排序数组中出现的次数

时间:2023-06-22 23:23:39浏览次数:37  
标签:数字 Offer int 37 mid 查找 数组 array 排序

【剑指Offer】37、数字在排序数组中出现的次数

题目描述:

统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于数字3在该数组中出现了4次,所以函数返回4。

解题思路:

既然输入的数组是有序的,所以我们就能很自然的想到用二分查找算法。以题目中给的数组为例,一个比较自然的想法是用二分查找先找到一个3,由于要计算的是输出的次数,所以需要在找到的这个3的左右两边分别再进行顺序扫描,进而得到3的个数,这样最坏的情况下时间复杂度仍然是O(n),和直接顺序扫描的效率相同。

因此,需要考虑怎样更好的利用二分查找算法,由于数组有序,如果知道了第一个k出现的位置和最后一个k出现的位置,那么我们就可以直接算出有多少个k。因此将思路转化为通过二分查找求第一个和最后一个k出现的位置。

以第一个k出现的位置为例,利用二分查找算法可以直接对数组进行二分,而每次总是拿中间的数字和k做比较,如果中间的数字大于k,那么第一个k只有可能出现在左边,下一次直接在数组左半段继续进行二分查找;如果中间的数字小于k,则第一个k只有可能出现在右边,则在右半段再查找;如果中间的数字等于k,我们先判断它前面的一个数字是不是k,如果不是,那么这个中间的数字就是第一个出现的位置,反之,如果中间数字前面的数字是k,那么第一个k仍然在前半段,继续查找。

同理,找最后一个k出现的位置方法类似,可以使用两个函数分别获得。

编程实现(Java):

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int first=getFirstIndex(array,k);
        int last=getlastIndex(array,k);
        if(first==-1 || last==-1)
            return 0;
        return last-first+1;
    }
    //二分查找
    public int getFirstIndex(int[] array,int k){
        int res=-1;
        if(array==null||array.length==0)
            return res;
        int low=0,high=array.length-1;
        while(low<=high){ //要有=
            int mid=low+(high-low)/2;
            if(array[mid]<k)
                low=mid+1;
            else if(array[mid]>k)
                high=mid-1;
            else { //相等
                mid=mid-1;
                if(mid<low || array[mid]!=k)
                    return mid+1;
                else 
                    high=mid;
            }
        }
        return res;
    }
    
    public int getlastIndex(int[] array,int k){
        int res=-1;
        if(array==null||array.length==0)
            return res;
        int low=0,high=array.length-1;
        while(low<=high){ //要有=
            int mid=low+(high-low)/2;
            if(array[mid]<k)
                low=mid+1;
            else if(array[mid]>k)
                high=mid-1;
            else { //相等
                mid=mid+1;
                if(mid>high || array[mid]!=k)
                    return mid-1;
                else 
                    low=mid;
            }
        }
        return res;
    }
}

标签:数字,Offer,int,37,mid,查找,数组,array,排序
From: https://www.cnblogs.com/bujidao1128/p/17498548.html

相关文章

  • 排序
    #include<stdio.h>#include<stdlib.h>#defineMAX1000voidprintList(intlist[],intn){ inti; for(i=0;i<n;i++){ printf("%d",list[i]); } printf("\n");}voidinsertSort(intlist[],......
  • 钉钉和抖音Android岗面筋,阿里挂了HR面,抖音通过收获Offer
    前言这一次的话,主要就是只投了钉钉和抖音两个部门,然后为了保险起见,让指导老师给我推荐了一个小公司,因为实在太想实习了,想着如果面试不上,总要有一个保底的机会。当然那家公司也挺nice的,我跟老总说了来意之后,老总直说让我全力冲,位置给我留着,所以在这里非常感谢吴总您对我的支持。阿里......
  • 热门文章37:人工智能在心理健康预警中的应用
    目录标题:37.人工智能在心理健康预警中的应用背景介绍:心理健康是当前社会热点话题之一,随着经济的发展、社会的变化以及竞争的加剧,人们的心理健康问题越来越受到关注。心理健康问题不仅会影响个人的生活质量,还会对社会的稳定产生负面影响。因此,在心理健康领域开展人工智能技术的......
  • 历时2个月喜提2字节安卓岗offer面试经验分享
    前言从2020年11月开始面试准备到2020年最后一天31号晚上7点收到短信offer,历时两个月,在熬夜猝死边缘疯狂试探的我,终于等来我梦寐以求的“跨年礼物”。“日尼玛,退钱”,《温暖的抱抱》电影前10分钟的开场剧情,让我不禁想着该如何说服朋友一起离场,却被自己短信铃声拉回了思绪,“应该调成静......
  • 线段树优化建图 拓扑排序 6.22西安集训T1
    题目链接有一条无限长的数轴,上面有 nn 个坑,第 ii 个坑的位置为 x_ixi​。你将要在数轴上再放置 nn 个球,第 ii 个将要放到的位置为 y_iyi​。每当有一个球被放上去之后,它就会滚落到离它最近的一个坑里并填上那个坑。如果有两个坑都离它最近,那么它会落到左边的里面。现......
  • 6轮面试辛苦拿到阿里Android开发offer,却从22k降到15k,在逗我?
    一小伙工作快3年了,拿到了阿里云Android开发岗位P6的offer,算HR面一起,加起来有6轮面试了,将近3个月的时间,1轮同级+1轮Android用人部门leader+1轮Android组leader+1轮项目CTO+1轮HR+1轮HRBP。一路上各种事件分发机制、自定义View、handler原理、多线程、hashmap、手写算法、......
  • Android面试技巧总结,这下offer稳啦
    最近有很多朋友给我后台留言:自己投了不少简历,但是收到的面试邀请却特别少;好不容易收到了大厂的面试邀请,但是面试官问得太深了,结果也挂了;对于面试官的问题,明明知道该怎么做,但是却说不清楚。这些问题不是个例,很多人都有这样的困扰。很大一部分是技术层面的问题。薪资比较高的前端岗位......
  • 某大厂程序员自述:年龄37,年薪百万,等着被公司“干掉”
    35岁,作为程序员基本就慢慢干不动了?面对这个问题,许多业内人士给出了非常中肯的三条路:第一条:创业第二条:转管理第三条:走技术大龄程序员的“求生之路”,看上去格外漫长,且充满了不确定性,前途未卜,心中怎能不忧虑?程序员,年纪越大,技术往往越退化,竞争力会逐渐变差,结果可想而知。面对中年危机,很......
  • 【剑指Offer】35、数组中的逆序对
    【剑指Offer】35、数组中的逆序对题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007。输入描述:题目保证输入的数组中没有的相同的数......
  • 热门文章37:人工智能在心理健康预警中的应用
    目录标题:37.人工智能在心理健康预警中的应用背景介绍:心理健康是当前社会热点话题之一,随着经济的发展、社会的变化以及竞争的加剧,人们的心理健康问题越来越受到关注。心理健康问题不仅会影响个人的生活质量,还会对社会的稳定产生负面影响。因此,在心理健康领域开展人工智能技术的......