算法的学习笔记—数字在排序数组中出现的次数(牛客JZ53)

news2024/11/29 4:48:35

在这里插入图片描述

img

😀前言
在编程中,查找有序数组中特定元素的出现次数是一个常见的问题。本文将详细讲解这个问题的解决方案,并通过二分查找法优化效率。

🏠个人主页:尘觉主页

文章目录

  • 🥰数字在排序数组中出现的次数
    • 💖题目链接
    • 💗题目描述
      • 示例
    • 💞解题思路
      • 寻找第一个出现位置
      • 寻找最后一个出现位置
    • 😊代码实现
      • 二分查找:查找第一个 `K`
      • 计算 `K` 的出现次数
    • 💝代码解释
      • 边界情况
      • 示例解析
    • 🥰时间复杂度分析
    • 😄总结

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

💖题目链接

牛客网

💗题目描述

给定一个递增排序的数组 nums 和一个目标数字 K,要求找到该数字在数组中出现的次数。例如,输入数组 nums = [1, 2, 3, 3, 3, 3, 4, 6],目标数字 K = 3,输出为 4,因为数字 3 出现了 4 次。

示例

Input:
nums = 1, 2, 3, 3, 3, 3, 4, 6
K = 3

Output:
4

💞解题思路

我们可以利用数组的有序性,通过二分查找的方式来优化查找过程。具体思路是:

  1. 找到目标数字 K 第一次出现在数组中的位置。
  2. 找到目标数字 K 最后一次出现在数组中的位置。
  3. 利用两次查找到的索引,计算出该数字出现的次数。

寻找第一个出现位置

为了找到 K 第一次出现在数组中的位置,我们可以对标准二分查找进行修改:

  • nums[mid] == K 时,不能立即返回,而应该继续向左边(低索引)搜索,以找到 K 出现的最早位置。
  • 如果 nums[mid] >= K,则搜索左区间(即缩小 high),否则继续搜索右区间。

寻找最后一个出现位置

类似地,我们可以寻找 K 最后一次出现的位置。或者,我们可以通过查找 K + 1 第一次出现的位置,再向前移动一位得到 K 最后一次出现的位置。

通过查找 K 的第一个和 K + 1 的第一个位置,两个索引的差就是 K 在数组中的出现次数。

😊代码实现

二分查找:查找第一个 K

private int binarySearch(int[] nums, int K) {
    // 初始化 low 为数组的起始索引 0,high 为数组的长度(即 nums.length)
    int low = 0, high = nums.length;

    // 使用 while 循环,当 low 小于 high 时继续迭代
    while (low < high) {
        // 计算 mid,mid 是 low 和 high 的中间索引,防止溢出的写法
        int mid = low + (high - low) / 2;
        
        // 如果 nums[mid] 大于等于 K,则将 high 设为 mid
        // 意思是当前的 mid 可能是我们要找的元素位置,但还需要继续检查更前面的部分
        if (nums[mid] >= K) {
            high = mid;
        } else {
            // 否则,说明 mid 处的元素小于 K,应该向右侧查找
            low = mid + 1;
        }
    }

    // 当 low == high 时,low 即为第一个大于等于 K 的元素的索引
    return low;
}

计算 K 的出现次数

通过上面的 binarySearch 函数,可以进一步计算 K 出现的次数:

public int GetNumberOfK(int[] nums, int K) {
    int first = binarySearch(nums, K);  // 找到 K 第一次出现的位置
    int last = binarySearch(nums, K + 1);  // 找到 K+1 第一次出现的位置
    // 如果 K 不在数组中,直接返回 0
    return (first == nums.length || nums[first] != K) ? 0 : last - first;
}

  1. 首先通过 binarySearch(nums, K) 查找到 K 第一次出现的位置。
  2. 然后通过 binarySearch(nums, K + 1) 查找到大于 K 的第一个数字的位置。
  3. 通过 last - first 计算 K 的出现次数。如果 first 超出了数组的范围,或者 nums[first] != K,则说明数组中没有 K,返回 0

💝代码解释

  1. binarySearch(nums, K) 用于查找 K 第一次出现的位置。在找到 K 之后,继续搜索左半部分,直到确定其第一次出现的位置。
  2. binarySearch(nums, K + 1) 用于查找比 K 大的第一个元素的位置,进而通过该位置计算出 K 的最后一次出现的位置。
  3. 最终的 GetNumberOfK 方法结合了这两个查找结果,返回 K 在数组中出现的次数。

边界情况

  • 如果数组为空,返回 0。
  • 如果数组中没有 K,返回 0。
  • 如果 K 在数组中的出现次数为 1 或多次,程序也能正确处理。

示例解析

考虑以下数组:

nums = [1, 2, 3, 3, 3, 3, 4, 6]
K = 3

  1. binarySearch(nums, 3) 找到 3 第一次出现的位置,即索引 2。
  2. binarySearch(nums, 4) 找到第一个比 3 大的元素(即 4)的位置,即索引 6。
  3. 因此,3 出现的次数为 6 - 2 = 4

🥰时间复杂度分析

  • 时间复杂度: 由于每次查找的时间复杂度是 O(log n),因此两次二分查找的总时间复杂度为 O(log n)。
  • 空间复杂度: 只使用了常数空间,空间复杂度为 O(1)。

😄总结

通过二分查找的方式,可以在 O(log n) 的时间复杂度下高效地计算有序数组中某个数字的出现次数。这种方法不仅适用于该特定问题,还可以应用于其他类似的查找问题,如查找有序数组中的区间或范围。掌握二分查找的变形技巧,对于解决数组相关问题非常有帮助。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九、pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…

深入浅出:深度学习模型部署全流程详解

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【论文精读】PSAD&#xff1a;小样本部件分割揭示工业异常检测的合成逻辑每日一言&#x1f33c;: 生活要有所期待&#xff0c; 否则就如同罩在…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…

查缺补漏----用户工作区,系统缓冲区,外设工作最短时间计算

对于下面这一题&#xff0c;分析起来很简单&#xff1a; 答案&#xff1a;C 以上是单缓冲区&#xff0c;补充双缓冲区是什么情况&#xff1a; 1.假设磁盘块与缓冲区大小相同&#xff0c;每个盘块读入缓冲区的时间为15us&#xff0c;由缓冲区送至用户区的时间是5us&#xff0c…

etl-查询错误log日志和oracle删除数据表空间

查看weblogic日志的目录 建立连接ssh root192.168.30.1xx 密码hygd123 找到下面路径中的文件 cd /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/bapp-logs 查看log日志 tail -f -n 400 Adminservers.log oracle删除表空间&#xff08;切换到dba用户…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

Qt开发-----线程调度

目录 前言 一、Linux下查看进程的情况 二、线程的创建 三、多线程的创建和使用 前言 以下引用内容源自正点原子Qt开发指南文档。 我们写的一个应用程序&#xff0c;应用程序跑起来后一般情况下只有一个线程&#xff0c;但是可能也有特殊情况。比如我们前面章节写的例程都跑…

《YOLO目标检测》—— YOLOv1 详细介绍

文章目录 一、算法特点二、网络结构三、检测过程四、损失函数五、性能表现六、优缺点 YOLO v1&#xff08;You Only Look Once version 1&#xff09;是一种快速的目标检测算法&#xff0c;以下是对YOLO v1的详细介绍&#xff1a; 一、算法特点 端到端的网络结构&#xff1a;Y…

项目:Boost 搜索引擎

项目&#xff1a;Boost 搜索引擎 1、项目背景 公司&#xff1a;百度、360、搜狗、谷歌 …站内搜索&#xff1a;搜索的数据更垂直&#xff08;相关&#xff09;&#xff0c;数据量小 2、整体框架 3、技术栈和项目环境 技术栈&#xff1a;C/C C11&#xff0c;STL&#xff0c;jso…

【JAVA毕设】基于JAVA的仓库管理系统

一、项目介绍 本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router实现动态路由&#xff0c;Ajax实现前后端通信&#xff0c;Element-plus组件库使页面快速成型。后端部分&#xff1a;采用SpringBoot作为开发框架&#xff0c;同时集成MyBatis、Redis、…

C#中的LINQ之美:优雅的数据查询与操作

LINQ&#xff08;Language Integrated Query&#xff0c;语言集成查询&#xff09;是C#中一个强大的工具&#xff0c;它将查询功能直接融入到语言中&#xff0c;使开发者能够以一种更直观、更接近自然语言的方式来操作数据。LINQ不仅能极大地提高开发效率&#xff0c;而且让代码…

掌握ElasticSearch(五):查询和过滤器

一、查询和过滤器的区别 在 Elasticsearch 中&#xff0c;查询&#xff08;Query&#xff09;和过滤器&#xff08;Filter&#xff09;是用于检索和筛选数据的重要组成部分。它们虽然都能用来查找文档&#xff0c;但在性能和用法上有所不同。下面详细介绍查询和过滤器的概念以…

Lucas带你手撕机器学习——K近邻

K近邻 (K-Nearest Neighbor KNN) K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种简单直观的机器学习算法&#xff0c;适用于分类和回归问题。它的核心思想是&#xff1a;判断一个数据点的类别或预测值时&#xff0c;参考它在特征空间中最近的 KKK 个数据点…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

什么是微服务中的反应性扩展?

大家好&#xff0c;我是锋哥。今天分享关于【什么是微服务中的反应性扩展&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是微服务中的反应性扩展&#xff1f; Reactive Extensions 也称为 Rx。这是一种设计方法&#xff0c;我们通过调用多个服务来收集结果…

STM32G474使用TIM2触发DAC输出输出正弦波

STM32G474使用TIM2触发DAC输出&#xff0c;数据从内存到外设就要使用DMA来协助。DAC1每隔1秒输出一个正弦波数据&#xff0c;就会模拟近似得到模拟的正弦波形。用来测试CPU内部的运算放大器&#xff0c;或者用作其它模拟输入信号。 测试程序如下&#xff1a; #include "…

立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!

前言&#xff1a;本文参考&#xff0c;韦东山老师开发文档&#xff0c;连接放在最后。 为什么需要中断管理函数&#xff1f; 在FreeRtos操作系统中&#xff0c;需要实时响应性&#xff0c;也就是随时随地必须保证正常多任务的运行&#xff0c;如果有中断发生&#xff0c;因为中…

Spring Cloud --- Sentinel 规则持久化

为什么要持久化 一旦我们重启微服务应用&#xff0c;sentinel 规则将消失&#xff0c;生产环境需要将配置规则进行持久化 怎么实现持久化 将限流配置规则持久化进 Nacos 保存&#xff0c;只要刷新 8401 某个 rest 地址&#xff0c;sentinel 控制台的流控规则就能看到&#x…

keil新建工程HC32L176MATA

先看一下最后的文件夹结构&#xff08;文件夹结构可以根据项目实际的需要去定义&#xff09; keil内&#xff1a; 参考文章&#xff1a; KEIL平台下新建华大HC32F460单片机工程笔记_hc32f keil环境搭建-CSDN博客 &#xff08;我根据需要&#xff0c;创建的文件夹结构和原文是有…