剑指Offer——数字在排序数组中出现的次数

剑指Offer第38题(数字在排序数组中出现的次数) (本博客旨在个人总结回顾) 题目描述: 统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。 解题思路: ①直接遍历数组,计算某个数字出现的次数。时间复杂度为O(n).<这肯定不是面试官想要的答案,这是个人都知道吧,可这个职位肯定不是是个人就能胜任的吧,其他题目也也可以参考这个思路~_... 阅读详情

题目:统计一个数字在排序数组中出现的次数。

备注:思路一和思路二是一样的,思路二代码更加简洁。

常见的思路是利用二分查找到一个K之后向两边扫描,如果有N个K的话时间复杂度就是O(n),不如下面的思路时间复杂度低。

思路一:利用二分查找;查找第一个K的位置,查找最后一个K的位置,相减即可得到。时间复杂度为O(LogN)+O(LogN),所以总的时间复杂度为O(logN);

代码:

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       if(array==null||array.length==0)
            return 0;
        int num=0;
        int first=getFirstOfK(array,k,0,array.length-1);
        int last=getLastOfK(array,k,0,array.length-1);
         if(first>-1&&last>-1) {
            num = last - first + 1;
        }
        return num;
    }
     public int getFirstOfK(int [] array ,int k, int start,int end){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        if(array[mid]==k){
            if(mid==0||(mid>0&&array[mid-1]!=k))
                return mid;
            else
                end=mid-1;
        }else if(array[mid]>k){
            end=mid-1;
        }else{
            start=mid+1;
        }
        return getFirstOfK(array,k,start,end);
    }
    public int getLastOfK(int [] array , int k,int start,int end){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        if(array[mid]==k){
            if(mid==array.length-1||(mid<array.length&&array[mid+1]!=k)){
                return mid;
            }else{
                start=mid+1;
            }
        }else if(array[mid]<k){
            start=mid+1;
        }else{
            end=mid-1;
        }
        return getLastOfK(array,k,start,end);
    }
}

思路二:只写一个寻找第一个K节点的方法,可以找到第一个K和第一个K+1;

public int GetNumberOfK(int[] nums, int K) {
    int first = binarySearch(nums, K);
    int last = binarySearch(nums, K + 1);
    return (first == nums.length || nums[first] != K) ? 0 : last - first;
}

private int binarySearch(int[] nums, int K) { 
    //这里使用h=nums.length,主要是考虑到最后一位也是K的情况
    int l = 0, h = nums.length;
    while (l < h) {
        int m = l + (h - l) / 2;
        if (nums[m] >= K)
            h = m;
        else
            l = m + 1;
    }
    return l;
}

 

国产操作系统替换方案:3个避坑指南 坑核心误区避坑核心原则关键动作坑一:选型只看信创信创目录=唯一标准兼容性优先,信创是约束三维评估(兼容性+信创+生态),分场景选型坑二:迁移只管能跑功能能跑=迁移成功性能确认+运维回归适配-压测-回归三阶段,基线对比坑三:不防二次迁移解决停服=完成任务一步到位,两级兼容信创路线优先,双轨制发布,终态规划。 阅读详情

相关推荐

Linux下离线安装Google Chrome

目录背景一、下载并安装Google Chrome二、下载并安装依赖包1.libvulkan.so.1()(64bit)2.读入数据总结 背景 项目中服务器被要求不能连接外网,不能直接联网安装,所以需要下载Google Chrome安装包和依赖包,然后离线安装。 linux下步骤都一样,不管ubuntu还是centos只是需要下载对应系统的文件包即可。 本机系统:CentOS 7 一、下载并安装Google Chrome 官方下载地址http://www.google.cn/chrome/browser/d

ancientapesman的博客 1万+

54.剑指Offer-数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数。 Input: nums = 1, 2, 3, 3, 3, 3, 4, 6 K = 3 Output: 4 解题思路 题是用了一个二分查找,确实是更快一些。 public int GetNumberOfK(int[] nums, int K) { int first = binarySearch(nums, K); in...

璀璨下的一点星辰 155

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 482

剑指offer第37题:数字在排序数组中出现的次数

剑指offer第37题:数字在排序数组中出现的次数题目描述数字在排序数组中出现的次数源码 题目描述 数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数。 源码 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int count =0; for(...

可爱的小腊肉 188

TMC2209串口配置实战:从寄存器解析到电机精准控制

本文详细解析TMC2209步进电机驱动芯片的串口配置方法,从硬件连接到UART通信协议,再到核心寄存器功能详解。通过实战案例展示电流控制、微步细分和速度调节等关键配置,帮助工程师实现电机精准控制,并提供了常见故障诊断和优化技巧。

f6g7h8i9j的博客 1174

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 988

剑指offer:面试题38——数字在排序数组中出现的次数

剑指offer:面试题38——数字在排序数组中出现的次数 题目: 统计一个数字在排序数组中出现的次数。 思路:如{1,2,3,3,3,3,4,5} 可以采用二分法,分别找到对应的数字的开头第一个和最后一个 class Solution { public: int GetNumberFirst(vector<int> data,int begin,int end,int k) { ...

MereX的博客 285

RTX 5090配Ubuntu 24.04踩坑记:手把手搞定OpenVLA-OFT环境(附版本避坑清单)

本文详细记录了在RTX 5090显卡和Ubuntu 24.04系统上部署OpenVLA-OFT环境的完整过程,包括驱动安装、CUDA配置、PyTorch版本选择等关键步骤。提供了经过验证的版本组合清单和常见错误解决方案,帮助开发者高效搭建AI开发环境。

weixin_30342209的博客 467

剑指Offer:数字在排序数组中出现的次数

剑指Offer:数字在排序数组中出现的次数 题目: 分析: 在排序数组中查找 →\rightarrow→ 二分查找 二分查找 一开始用下图中绿色的那种写法,然后发现找不到左边界(有双下划线的表示进行了比较,可以看出左边界没有被比较过). 所以换成了红色的那种. 反正二分查找记熟就是了.再总结一下伪代码: if (arr.size() <= 1) // 特殊处理 int left =...

小楼野马的博客 165

七天征服AutoSAR/SomeIP_04理解SoAD_LdCom_SD模块

本文深入解析了AUTOSAR平台下SOME/IP协议栈的架构设计与模块交互逻辑。重点剖析了SD模块(服务发现)和LdCom模块(通信适配层)与SoAD(Socket适配层)之间的复杂关联关系。文章通过详细配置表格和代码示例,阐述了服务注册发现机制、PDU路由控制策略、数据收发流程等核心功能,并形象地将三模块关系类比为"三极管结构"。特别强调了SD模块通过RoutingGroup实现通信路径的动态开关控制,以及LdCom模块在协议栈中的透传转发作用,帮助开发者理解配置规则背后的底层原理,提

大叔带刺的博客 199

链接文件及功能安全:基于Tasking的LSL链接文件知识点梳理及实际应用分析

本文旨在记录研究链接文件时所遇到的问题及个人理解,以便日后查阅。在探索过程中,我遇到了诸多问题,同时对链接文件有了初步的认识。通过记录这些问题与理解,我希望能够为后续的研究提供清晰的思路和有价值的参考。这不仅是对研究过程的总结,更是对未来学习和实践的有力支持。

梦想技术家 1103

剑指Offer 数字在排序数组中出现的次数

剑指Offer 数字在排序数组中出现的次数 题目描述:统计一个数字在排序数组中出现的次数。 解题步骤:由于数组是排好序的,可以通过两次二分查找分别找到大于target的位置和小于target的位置,两个位置之差就是target出现的次数。 代码: public int GetNumberOfK(int [] array , int k) { if(array.length<1) ...

张毅的博客 337

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2326

剑指offer 数字在排序数组中出现的次数【简单易懂,代码可以直接运行】

剑指offer 数字在排序数组中出现的次数【简单易懂,代码可以直接运行】 这道题有点水题的味道,不过我最近在学STL的容器,这道题恰好是用vector来存储数据的,写一写。 题目描述: 统计一个数字在排序数组中出现的次数。 例如输入排序数组 [1,2,3,3,3,3,4,5] 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4。 输入: 思路: 这道题就是匹配,匹配就完了。设立一个计数器,遍历整个vector找到与k值相同的值,每找到一个注意将计数器+1即可。这道题我并没有用到优化,听别的hx

于笨笨的博客 3048

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

剑指Offer | 数字在排序数组中出现的次数

做了个剑指Offer的题目目录,链接如下: https://blog.csdn.net/mengmengdastyle/article/details/80317246 一、题目 统计一个数字在排序数组中出现的次数。 二、思路 (1) 最简单方法,一个一个查找 三、代码 public int GetNumberOfK(int [] array , int k) { ...

强子的博客 197

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

剑指offer 数字在排序数组中出现的次数

为了方便自己和大家共同学习,本人整理了一些基本解法和比较巧妙的解法~ 代码整理自牛客网讨论区:https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2?f=discussion 剑指offer题型分类及各题的代码及解题思路 题目描述 统计一个数字在排序数组中出现的次数。 分析: 数组有序,可以用...

请叫我皮皮虾的博客 324

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《剑指Offer》Java刷题 NO.37 数字在排序数组中出现的次数(数组、二分查找)

《剑指Offer》Java刷题 NO.37 数字在排序数组中出现的次数(数组、二分查找) 传送门:《剑指Offer刷题总目录》 时间:2020-06-20 题目: 统计一个数字在排序数组中出现的次数。 思路: 一提到有序先想到二分法! 这道题的适用情况应该是非递减的情况 法一: 利用二分法先找到某个k然后往前往后找k并计数,直到不是k为止,适用于k比较小的情况,k比较大时会退化成O(N) 法二: 利用二分法找到k的上界和下界,复杂度:O(N) 上界(right) 定义为:当数组存在k时,上界是最后一

qq_39618369的博客 247

剑指offer——数字在排序数组中出现的次数

剑指offer——数字在排序数组中出现的次数 【题目描述】 统计一个数字在排序数组中出现的次数。 【解题思路】 这个题目的前提是在排序数组中,因此可以利用二分法减小寻找的范围。 题目中没有说该数组是升序排序还是降序排序,因此需要先判断数组是升序还是降序。 判断完是升序还是降序数组之后,每次寻找利用二分法缩小一半范围。以升序排序为例,当中间元素大于k时,说明目标元素一定在后半段;当中间元素小于k时,...

ma_ke_xin的博客 201

【剑指offer系列】54. 数字在排序数组中出现的次数

【剑指offer系列】54. 数字在排序数组中出现的次数

姚先生的全栈之路 156

【剑指offer】数字在排序数组中出现的次数

我做这道题,是先用二分查找找到该数字,而后再遍历其前后相同的数字,统计次数。这种做法的平均时间复杂度为O(logn),最坏情况下为O(n),剑指offer上给的思路是两次用二分查找分别找到该数字第一次和最后一次出现的位置,这样的时间复杂度平均和最坏都是O(logn),稍好些》 下面贴上我按照自己思路写的代码:

兰亭风雨的专栏 3289

剑指Offer(三十七):数字在排序数组中出现的次数

剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法、机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github:https://github.com/aimi-cn/AILearners 一、引子 这个系列是我在牛客网上刷《剑指Offer》的刷题笔记...

小明的博客 1126

剑指offer-数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数。 思路(剑指offer书上) o(n)的很容易想到 public class Solution { public int GetNumberOfK(int [] array , int k) { int num=0; for(int i=0 ;i< array.length; i++){ ...

zero 191

[剑指offer]-数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数。 思路 采用二分的思路分别查找k在数组中的第一个和最后一个的位置,下标相减加1就可得到k出现次数。 在二分查找中,当查找到k值时,GetFistOfK和GetLastOfK分别向前和向后查找下一个直到值不等于k,返回找到的下标值。 示例代码 public class Solution { public int GetNumberOfK(...

oayoat blog 460

剑指offer:搜索算法系列--67. 数字在排序数组中出现的次数,简单

【代码】剑指offer:搜索算法系列--67. 数字在排序数组中出现的次数,简单。

weixin_51243388的博客 197
上一篇: 剑指Offer——两个链表的第一个公共结点
下一篇: 剑指Offer——二叉搜索树的第k个结点
宁小葵
博客等级 码龄9年 4粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值