LeetCode题练习与总结:H 指数 Ⅱ--275

一、题目描述

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)至少 有 h 篇论文分别被引用了至少 h 次。

请你设计并实现对数时间复杂度的算法解决此问题。

示例 1:

输入:citations = [0,1,3,5,6]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。由于研究者有3篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3

示例 2:

输入:citations = [1,2,100]
输出:2

提示:

  • n == citations.length
  • 1 <= n <= 10^5
  • 0 <= citations[i] <= 1000
  • citations 按 升序排列

二、解题思路

  1. 首先,根据题目要求,我们需要找到最大的 h 值,使得至少有 h 篇论文的引用次数大于或等于 h。
  2. 因为数组已经按照升序排列,我们可以使用二分查找的方法来寻找这个 h 值。
  3. 在二分查找的过程中,我们需要检查 mid 位置的引用次数是否满足条件,即 citations[mid] >= n - mid,其中 n 是数组的长度。
  4. 如果满足条件,说明可能存在更大的 h 值,因此我们将 left 移动到 mid + 1 的位置继续查找。
  5. 如果不满足条件,说明 h 值应该小于 mid,因此我们将 right 移动到 mid - 1 的位置继续查找。
  6. 当 left 超过 right 时,停止查找,此时 right 就是我们要找的 h 值。

三、具体代码

class Solution {public int hIndex(int[] citations) {int n = citations.length;int left = 0, right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (citations[mid] >= n - mid) {// 满足条件,可能存在更大的 h 值right = mid - 1;} else {// 不满足条件,h 值应该小于 midleft = mid + 1;}}// 当循环结束时,right + 1 就是 h 指数return n - left;}
}

这段代码中,left 最终会停在第一个不满足 citations[mid] >= n - mid 的位置,而 n - left 就是我们要求的 h 指数。因为 left 指向的是第一个引用次数小于论文数量的索引,所以 n - left 就是从该索引到数组末尾的论文数量,即至少有 n - left 篇论文的引用次数大于或等于 n - left

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 代码中使用了二分查找算法,其核心是一个 while 循环,该循环会在每次迭代中将搜索范围减半。
  • 在最坏的情况下,循环会执行直到 left 超过 right,即当搜索范围缩小到无法再进行分割时。
  • 在每次迭代中,搜索范围都会从 [left, right] 变为 [left, mid - 1] 或 [mid + 1, right],其中 mid 是当前搜索范围的中间值。
  • 因此,循环的次数大约是 log(n),其中 n 是数组 citations 的长度。

综上所述,该算法的时间复杂度是 O(log n),即对数时间复杂度。

2. 空间复杂度
  • 空间复杂度主要考虑算法执行过程中所使用的额外空间。
  • 在这段代码中,我们使用了常数个额外空间,即 leftright 和 mid 这三个整型变量。
  • 这些变量占用的空间不会随着输入数组 citations 的大小而改变。

因此,该算法的空间复杂度是 O(1),即常数空间复杂度。

五、总结知识点

  • 类定义

    • class Solution 定义了一个名为 Solution 的类。
  • 方法定义

    • public int hIndex(int[] citations) 定义了一个公共方法 hIndex,它接受一个整数数组 citations 作为参数,并返回一个整数。
  • 变量声明和初始化

    • int n = citations.length; 声明并初始化了一个整数变量 n,用于存储数组 citations 的长度。
    • int left = 0, right = n - 1; 同时声明并初始化了两个整数变量 left 和 right,分别用于二分查找的左右边界。
  • 循环结构

    • while (left <= right) 使用了一个 while 循环来执行二分查找,直到 left 大于 right
  • 二分查找算法

    • int mid = left + (right - left) / 2; 计算中间位置 mid,防止 left 和 right 相加时可能发生的整数溢出。
    • 根据中间位置的值与 n - mid 的比较结果来调整搜索范围。
  • 条件判断

    • if (citations[mid] >= n - mid) 检查中间位置的论文引用次数是否满足 h 指数的条件。
    • else 分支处理不满足条件的情况。
  • 数组访问

    • citations[mid] 访问数组 citations 中索引为 mid 的元素。
  • 整数运算

    • 使用基本的整数加减和比较运算来调整 left 和 right 的值。
  • 算法逻辑

    • 代码的逻辑基于二分查找算法,用于在有序数组中找到满足特定条件的最大值。
  • 边界条件处理

    • 在二分查找的过程中,通过调整 left 和 right 的值来缩小搜索范围,直到找到正确的 h 指数。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

【C语言】分支与循环

文章目录 前言if语句关系操作符逻辑操作符&#xff1a;&& , || , &#xff01;switch语句if语句和switch语句的对比 while循环for循环do-while循环break和continue语句循环嵌套goto语句 前言 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是顺序结构、选择&…

12条职场经验总结

01 事干得好不好尚且不说&#xff0c;但是话一定要说得漂亮。 比如&#xff0c;当领导给你安排工作的时候&#xff0c;你一定要非常积极地响应&#xff0c;拍着胸脯跟领导说“放心吧”。至于后续到底怎么干&#xff0c;再结合实际情况有的放矢地把握。 02 当别人夸奖你的时…

Hugging Face 任意大模型仓库劫持 - 无声的破坏

摘要 在这篇博客中&#xff0c;我们展示了攻击者如何攻击Hugging Face的Safetensors转换空间及其相关的服务机器人。这些服务是一个在Hugging Face上广受欢迎的服务&#xff0c;专门用于将不安全的机器学习模型转换为更安全的版本。我们随后展示了如何通过Hugging Face自身的服…

GoogleNet原理与实战

在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet 的网络架构大放异彩。以前流行的网络使用小到11&#xff0c;大到77的卷积核。本文的一个观点是&#xff0c;有时使用不同大小的卷积核组合是有利的。 回到他那个图里面你会发现,这里的一个通过我们最大的池化…

《Linux从小白到高手》理论篇:Linux用户和组相关的命令

List item 本篇介绍Linux用户和组相关的命令&#xff0c;看完本文&#xff0c;有关Linux用户和组相关的常用命令你就掌握了99%了。Linux用户和组相关的命令可以分为以下六类&#xff1a; 一.用户和用户组相关查询操作命令&#xff1a; Id id命令用于显示用户的身份标识。常见…

职场中的10个“人情世故”,随处可见

职场上&#xff0c;“现实”是主基调。如果不通#人情世故#&#xff0c;可能举步维坚。很多时候&#xff0c;人情世故并不是什么高深的学问&#xff0c;就是在点点滴滴间&#xff0c;只要稍加注意&#xff0c;就能学通。下面这10条&#xff0c;是职场很常见的人情世故。 1、登门…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读幻行问题可重复读MVCC会出…

HTB:Synced[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the default port for rsync? 2.How many TCP ports are open on the remote host? 3.What is the protocol version used by rsync on the remote machine? 4.What is the most common command name on Linux to interact w…

一些关于上传数据-p7zip-full-压缩包的经验

目录 前言 7z 简介 Windows如何压缩tar.gz格式 一、下载7-ZIP 二、tar文件进一步压缩 说明&#xff1a; 前言 本人每次在linux服务器上执行apt-get install p7zip-full命令&#xff0c;都会有复杂依赖报错&#xff08;因为实验过程中用到的依赖包太多了&#xff09;&…

[Python学习日记-39] 闭包是个什么东西?

[Python学习日记-39] 闭包是个什么东西&#xff1f; 简介 闭包现象 闭包意义与作用 简介 在前面讲函数和作用域的时候应该提到过&#xff0c;当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量&#xff0c;但是在 Python 当中还有一种…

Linux中的多线程

Linux线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序 列” 进程是系统分配资源的基本实体 线程是CPU调度的基本单位 POSIX线程库 创建线程 功能&#xff1a;创建一个新的线程 原…

Tkinter打包成EXE安装文件

打包成 .exe可执行文件 1. 安装PyInstaller&#xff0c;命令如下&#xff1a; pip install pyinstaller2. 编写你的Tkinter应用程序&#xff1a; 创建一个Python文件&#xff0c;例如app.py&#xff0c;并写入你的Tkinter代码。 3. 在 app.py 文件所在的目录使用PyInstaller…

从零开始讲PCIe(5)——66MHZ的PCI总线与其限制

一、前言 在之前的内容中&#xff0c;我们已经基本了解了PCI总线的设计思路和传输机制&#xff0c;之前的内容我们都是基于33MHZ版本的PCI总线进行学习的&#xff0c;为了支持更到的带宽&#xff0c;PCI协议还有一种66MHZ的版本。 二、高带宽PCI&#xff08;66MHZ&#xff09;…

UML类图全解析

1.UML的基本介绍 1.1什么是UML 1.UML > 统一建模语言&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用于帮助软件开发人员进行思考和记录思路的结果。 2.UML本身是一套符号的规定&#xff0c;就像数学符号和化学符号一样&#xff0c;这样符号用于描述软…

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

交叠型双重差分法

交叠型双重差分法&#xff08;Staggered Difference-in-Differences, Staggered DiD&#xff09;是一种扩展的双重差分&#xff08;Difference-in-Differences, DiD&#xff09;方法&#xff0c;用于处理多个时间点的政策干预或处理组&#xff08;treatment group&#xff09;并…

JavaWeb的小结02

第2章-第2节 一、知识点 HttpServletRequest请求对象、HttpServletResponse响应对象、响应内容类型Content-Type、请求转发、重定向、ServletContext对象。 二、目标 深刻理解HttpServletRequest对象的作用。 深刻理解HttpServletResponse对象的作用。 掌握HttpServletRequ…

企业必备:搭建大模型应用平台实操教程

最近AI智能体很火&#xff0c;AI智能体平台化产品肯定属于大公司的。但在一些场景下&#xff0c;尤其是对业务数据要求很高的公司&#xff0c;那就只能用私有大模型。不一定完全是为了对外提供服务&#xff0c;对内改造工作流也是需要的。所以 我感觉未来大部分企业都会搞一个…

普渡PUDU MT1:AI赋能,破解大面积场景清洁新挑战

普渡AI智能扫地机器人PUDU MT1:破解大面积场景清洁难题的新利器 在仓储物流、工业车间、交通枢纽、大型商场等大面积场景中,清洁难题一直是管理者们头疼的问题。这些区域面积广阔,清洁任务繁重,传统清洁方式难以胜任。然而,普渡机器人最新推出的AI智能扫地机器人PUDU MT1…

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时&#xff0c;意味着该请求涉及跨域资源共享 (CORS)&#xff0c;并且该请求被预检了。理解这种请求的背景&#xff0c;主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …