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

在这里插入图片描述

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 = 3Output:
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 不在数组中,直接返回 0return (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.mzph.cn/diannao/57435.shtml

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

相关文章

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目&#xff0c;需要到客户那边进行项目部署&#xff0c;项目部署完成后我们需要进行项目后端接口的测试功能&#xff0c;但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

计算机毕业设计Hadoop+大模型在线教育大数据分析可视化 学情分析 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计

一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬勃发展&#xff0c;学习分析技术和自适应学习也在近年内得到了重大突破。在线教育是互联网技术与传统教育的结合&#xff0c;是当前中国教育信息化发展最快的领域&#xff0c;而当下最迫切的是有效整合教育资源和互联…

Zabbix 监控自动化

一、网络自动发现 部署环境 zabbix server ZBX 192.168.27.152 CentOS7.9 zabbix server 6.4.8 zabbix agent agent01 192.168.27.154 CentOS7.9 zabbix agent 6.4.8 zabbix agent agent02 192.168.27.158 CentOS7.9 zabbix agent 6.4.8 1.搭建LNMP环境 2.安装配…

[linux]快速入门

学习目标 通过学习能够掌握以下的linux操作 操作系统 按照应用领域的不同, 操作系统可以分为几类 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 不同领域的主流操作系统 桌面操作系统 Windows(用户数量最多)MacOS(操作体验好&#xff0c;办公人士首选)Linux…

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

自动驾驶系列—激光雷达点云数据在自动驾驶场景中的深度应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【Golang】Go语言中如何创建Cron定时任务

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

拼三角问题

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 一题目&#xff1a; 二思路&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; 题目链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 二思路&#xff1a; 思路&#xff1a;首先明白能组成三角形…

【Next.js 项目实战系列】07-分配 Issue 给用户

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】06-身份验证 分配 Issue 给用户 本节代码链接 Select Button​ # /app/issues/[i…

几何算法系列:空间实体体积计算公式推导

1.前言 面积和体积的计算是常见和基础的几何算法话题&#xff0c;面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。 有关面积的计算&#xff0c;可以参考博主此前的文章&#xff0c; 一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章…

设计模式——装饰者模式(8)

一、定义 指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额…

arp代答观察

文章目录 代答和代理简述实验前提先不开启proxy代答的配置开启代答总结 代答和代理简述 ARP&#xff08;地址解析协议&#xff09;是在局域网中用于将IP地址映射到MAC地址的协议。在理解 ARP 代答和 ARP 代理之前&#xff0c;让我们先澄清一下 ARP 的基本工作原理。 ARP 代答&…

在 VS Code 中轻松绘图:Draw.io Integration 插件详解

文章目录 在 VS Code 中轻松绘图&#xff1a;Draw.io Integration 插件详解一、什么是 Draw.io Integration 插件&#xff1f;二、插件安装指南1. 安装步骤2. 配置插件 三、如何使用 Draw.io Integration 插件&#xff1f;1. 创建新绘图文件2. 编辑现有图表3. 常用功能与技巧 四…

中小型医院网站:Spring Boot框架详解

5 系统实现 5.1 用户功能模块的实现 用户进入本系统可查看系统信息&#xff0c;包括首页、门诊信息、药库信息以及系统公告信息等&#xff0c;系统前台主界面展示如图5-1所示。 图5-1系统前台主界面图 5.1.1用户登录界面 用户要想实现预约挂号功能&#xff0c;必须登录系统&a…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

k8s部署Kafka集群超详细讲解

准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka&#xff1a;3.7.1版本&#xff0c;apche版本 Zookeeper&#xff1a;3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…

股价创52周新高,云顶新耀成为“黑马”的启示录

踏入2024年以来&#xff0c;创新药产业持续释放积极信号。今年本土创新药出海交易额已超200亿美元&#xff0c;最近医保续约和谈判也有望促进国内创新药长期放量。 市场预期转好之下&#xff0c;生物医药板块在新一轮牛市中进入了估值修复的阶段。HSHKBIO&#xff08;恒生香港…

【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)

零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前&#xff0c;我们要学习一款LVGL官方的UI设计工具SquareLine Studio&#xff0c;使用图形化设计方式设计出我们想要的界面&#xff0c;然后生成对应源文件导入工程使用…

时空智友企业流程化管控系统uploadStudioFile接口存在任意文件上传漏洞

免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 时空智友…

JMeter使用不同方式传递接口参数

1、使用 HTTP 请求中的参数&#xff1a; 在 JMeter 的测试计划中&#xff0c;添加一个 "HTTP 请求" 元件。 在 "HTTP 请求" 元件的参数化选项中&#xff0c;可以添加参数的名称和值。可以手动输入参数&#xff0c;也可以使用变量来传递参数值。 如果要使…