算法的学习笔记—数字在排序数组中出现的次数(牛客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,一经查实,立即删除!

相关文章

js 基础补充3

1. 闭包 在函数内部定义的函数&#xff0c;可以访问改函数的属性和方法 私有属性 延长变量的生命周期&#xff0c;更好的避免命名冲突 缺点&#xff1a;内存消耗比较大&#xff0c;不建议频繁使用 2. js 原型 原型链 访问对像的属性方法&#xff0c;不光会在对象上查找还会在…

简单的 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…

Java实现HTTP代理的技巧与方法

在互联网时代&#xff0c;代理IP已经成为了网络访问中不可或缺的一部分。无论是为了保护隐私&#xff0c;还是为了访问特定的网络资源&#xff0c;代理IP都能发挥重要作用。那么&#xff0c;如何在Java中实现HTTP代理呢&#xff1f;本文将带您逐步了解这个过程。 什么是HTTP代…

YOLO V3 网络构架解析

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

如何防止服务器被渗透攻击

服务器作为企业和组织的重要基础设施&#xff0c;其安全性至关重要。一旦服务器被黑客渗透&#xff0c;不仅会导致数据丢失、服务中断等问题&#xff0c;还可能引发更严重的法律和财务后果。因此&#xff0c;采取有效的措施来预防服务器被渗透攻击是非常必要的。本文将介绍几个…

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

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

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (五):POST上传文件的设置

本项目旨在学习如何快速使用 nodejs 开发后端api&#xff0c;并为以后开展其他项目的开启提供简易的后端模版。&#xff08;非后端工程师&#xff09; 由于文档是代码写完之后&#xff0c;为了记录项目中需要注意的技术点&#xff0c;因此文档的叙述方式并非开发顺序&#xff0…

【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…

c++的头文件到底应该怎么写?

总结一下头文件的编写规则和注意事项&#xff1a; 头文件的作用是供其他的 .cpp 文件包含&#xff0c;它们本身不直接参与编译&#xff0c;但其内容会在多个 .cpp 文件中被编译。 头文件中应该只放变量和函数的声明&#xff0c;而不能放它们的定义。因为头文件的内容会被多个 …

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

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

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

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

arp代答观察

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

鹏哥C语言81-82---指针和数组+二级指针+指针数组

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> //--------------------------------------------------------------------------------------------------------5. 指针和数组 数组&#xff1a;一组相同类型元素的集合 指针变量&…

在 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…