力扣(H指数)

一、题目分析

(一)问题描述

给定一个整数数组 citations,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。我们需要计算并返回该研究者的 H 指数。根据维基百科定义:H 指数代表“高引用次数”,一名科研人员的 H 指数是指他(她)至少发表了 h 篇论文,并且至少有 h 篇论文被引用次数大于等于 h 。如果有多个可能的 h 值,取最大的那个。

比如,若有论文引用次数数组为 [3,0,6,1,5],经过计算其 H 指数是 3,因为有 3 篇论文(引用次数为 3、6、5 )的引用次数大于等于 3 。

(二)核心目标

遍历处理论文引用次数数组,找到最大的 h 值,满足存在至少 h 篇论文的引用次数 ≥ h 。

二、算法思想:排序 + 线性遍历(贪心思想的体现)

(一)排序的作用

首先对 citations 数组进行排序(升序排序 )。排序之后,数组的顺序能够帮助我们更方便地找到符合 H 指数定义的那个 h 值。升序排序后,数组后面的元素值相对较大,我们可以从后往前或者从前往后,利用数组的有序性来判断满足条件的 h 。

(二)线性遍历与贪心策略

排序完成后,进行线性遍历。我们的贪心策略是:从数组的一端开始,寻找满足“存在 h 篇论文引用次数 ≥ h”这一条件的最大 h 。具体来说,对排序后的数组,我们从前往后遍历,对于索引 i ,考虑以 n - i 作为可能的 h 值(n 是数组长度,也就是论文的总篇数 ),判断当前论文的引用次数 citations[i] 是否大于等于 n - i 。一旦找到第一个满足该条件的 i ,那么 n - i 就是我们要找的最大 H 指数。这是因为数组是升序排列的,后面的元素值更大,当在某个位置满足条件后,继续往后遍历得到的 n - i 会更小,所以第一个满足条件的 n - i 就是最大的符合要求的 H 指数,这体现了贪心算法中“找到第一个满足局部条件就能得到全局最优”的思想 。

三、代码实现及详细注释

import java.util.Arrays;class Solution {public int hIndex(int[] citations) {// 第一步:对引用次数数组进行升序排序Arrays.sort(citations);int n = citations.length; // 获取论文的总篇数,也就是数组的长度for (int i = 0; i < n; i++) { // 对于当前索引i,考虑h值为n - i。这里的含义是:// 假设h是n - i,那么需要至少有n - i篇论文的引用次数≥h// 由于数组是升序排序的,citations[i]及后面的元素是较大的,当citations[i] >= n - i时,// 说明从i到n - 1位置的这n - i篇论文的引用次数都 >= citations[i](因为升序),也就 >= n - iif (citations[i] >= n - i) { return n - i; // 找到满足条件的最大h值,直接返回}}return 0; // 如果遍历完都没有满足条件的,说明H指数为0(比如所有论文引用次数都为0的情况 )}
}

(一)代码执行流程详解

  1. 排序操作
Arrays.sort(citations);

这行代码使用 Java 内置的 Arrays.sort 方法对 citations 数组进行升序排序。例如,对于输入数组 [3,0,6,1,5],排序后会变成 [0,1,3,5,6] 。排序的时间复杂度为 O(nlog⁡n)O(n\log n)O(nlogn) ,其中 n 是数组的长度,这是由排序算法的时间复杂度决定的(Java 中 Arrays.sort 对于基本数据类型数组采用的是优化的快速排序等算法,平均时间复杂度为 O(nlog⁡n)O(n\log n)O(nlogn) )。

  1. 遍历判断过程
int n = citations.length; 
for (int i = 0; i < n; i++) { if (citations[i] >= n - i) { return n - i; }
}
  • 首先获取数组长度 n ,代表论文的总篇数。
  • 然后进入循环遍历,i 从 0 开始递增到 n - 1 。对于每一个 i ,计算 n - i ,这个值代表的是假设的 h 值,含义是当前考虑有 n - i 篇论文可能满足引用次数 ≥ n - i 。
  • 因为数组是升序排序的,citations[i] 是第 i + 1 小的引用次数(数组索引从 0 开始 ),当 citations[i] >= n - i 时,说明从第 i 篇论文开始(包括第 i 篇 ),后面一共有 n - i 篇论文(索引从 i 到 n - 1 ),它们的引用次数都大于等于 citations[i] ,自然也大于等于 n - i (因为 citations[i] >= n - i 且数组升序 )。所以此时 n - i 就是满足条件的 H 指数,直接返回即可。这是因为我们是从前往后遍历,一旦找到第一个满足条件的 i ,对应的 n - i 就是最大的可能的 H 指数。比如排序后的数组 [0,1,3,5,6] ,n = 5 ,当 i = 2 时,n - i = 3 ,citations[2] = 3 ,满足 citations[i] >= n - i ,所以返回 3 ,也就是正确的 H 指数。
  1. 返回默认值
return 0; 

如果循环遍历结束后,没有找到满足 citations[i] >= n - i 的情况,说明所有论文的引用次数都非常低,比如数组全为 0 ,此时 H 指数为 0 ,所以返回 0 。

四、算法的时间复杂度和空间复杂度分析

(一)时间复杂度

  • 排序操作的时间复杂度:使用 Arrays.sort 对数组进行排序,其时间复杂度为 O(nlog⁡n)O(n\log n)O(nlogn) ,其中 n 是数组 citations 的长度。
  • 线性遍历的时间复杂度:排序后进行的线性遍历,时间复杂度为 O(n)O(n)O(n) ,n 同样是数组长度。

所以,整个算法的时间复杂度由排序操作主导,为 O(nlog⁡n)O(n\log n)O(nlogn)

(二)空间复杂度

  • 排序操作在 Java 中,对于基本数据类型数组的 Arrays.sort 方法,采用的是原地排序(大部分情况下 ),不需要额外的大量空间,空间复杂度为 O(log⁡n)O(\log n)O(logn) (主要是排序过程中递归调用栈或者用于辅助排序的空间,基于快速排序等算法的实现 )。
  • 其他变量如 n 、i 等都是常数级别的空间占用。

所以,整个算法的空间复杂度为 O(log⁡n)O(\log n)O(logn) (主要由排序操作决定 ),在大多数情况下可以认为是较为高效的空间利用。

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

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

相关文章

标准io(1)

标准I/O基础概念标准I/O&#xff08;Standard Input/Output&#xff09;是C语言提供的一组高级文件操作函数&#xff0c;位于<stdio.h>头文件中。与低级I/O&#xff08;如Unix的系统调用read/write&#xff09;相比&#xff0c;标准I/O引入了缓冲机制&#xff0c;能显著提…

线性代数1000题学习笔记

1000题线代基础第一章1-101000题线代基础第二章1-171000题线代基础第三章1-11

LeetCode算法日记 - Day 8: 串联所有单词的子串、最小覆盖子串

目录 1.串联所有单词的子串 1.2 解法 1.3 代码实现 2. 最小覆盖子串 2.1 题目解析 2.2 解法 2.3 代码实现 1.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度…

linux实战:基于Ubuntu的专业相机

核心组件就是QTimerOpenCV的组合方案摄像头启停控制用QPushButton实现&#xff0c;帧显示必须用QLabel而不能用普通控件&#xff0c;视频流刷新用QTimer比多线程更简单想快速实现摄像头控制功能&#xff0c;核心组件就是QTimerOpenCV的组合方案。摄像头启停控制用QPushButton实…

《深度剖析前端框架中错误边界:异常处理的基石与进阶》

错误边界作为一种特殊的组件机制&#xff0c;正悄然重塑着应用应对异常的底层逻辑。它并非简单的代码片段组合&#xff0c;而是一套贯穿组件生命周期的防护体系&#xff0c;其核心价值在于将局部错误的影响牢牢锁定在可控范围内&#xff0c;避免整个应用陷入不可挽回的崩溃状态…

6GB显存玩转SD微调!LoRA-scripts本地部署教程,一键炼出专属AI画师

一、介绍LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一个专为训练低秩自适应&#xff08;LoRA&#xff09;模型设计的开源工具集主要应用于Stable Diffusion等AI绘图模型的微调&#xff0c;帮助用户高效创建定制化风格、角色或概念的轻量级模型。目前已…

探索AI的数学奇迹:Gemini 2.5 Pro如何摘得IMO金牌

🌍 引言:从人类天才到AI奇才的跨越 想象一下,一个AI模型坐在国际数学奥林匹克(IMO)的考场里,手里拿着笔(好吧,其实是处理token),面对那些让高中生们头疼不已的难题。它不是靠死记硬背,而是通过深思熟虑的推理,一步步攻克难关。这听起来像科幻小说,但2025年,这已…

MCP学习与实践

目录 1.MCP简介 1.1 MCP是什么 1.2 MCP与Agent关系&#xff1a; 1.3 MCP的架构 2. MCP原理 2.1 MCP 工作过程 2.2 MCP 通讯方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地图MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文详细讲解了什么是…

MySQL(187)如何使用pt-query-digest进行查询分析?

使用 pt-query-digest 工具可以帮助分析 MySQL 查询的性能&#xff0c;找出慢查询、频繁查询以及消耗资源较多的查询&#xff0c;从而为优化提供依据。以下是详细深入的使用 pt-query-digest 进行查询分析的步骤和相关示例。 一、安装 pt-query-digest pt-query-digest 是 Perc…

分享一个基于Python和Hadoop的的电信客户特征可视化分析平台 基于Spark平台的电信客服数据存储与处理系统源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

初识STL

一 、STL的诞生在C发展早期&#xff0c;程序员在不同的项目中需要反复编写相似的数据结构和算法。重复开发带来以下问题&#xff1a;代码冗余&#xff1a;每个项目都要重新实现基本数据结构和算法维护困难&#xff1a;不同人编写的代码风格不一致&#xff0c;难以维护效率低下&…

DDoS 防护的未来趋势:AI 如何重塑安全行业?

随着网络攻击规模和复杂性的不断升级&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击已成为企业数字化转型中的一大威胁。传统防御手段在应对智能化、动态化的攻击时逐渐显露出局限性。而人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;正为 DDoS 防护…

【每天一个知识点】深度领域对抗神经网络

Deep Domain Adversarial Neural Network&#xff08;深度领域对抗神经网络&#xff0c;DDANN&#xff09; 是一类结合 深度学习 与 领域自适应&#xff08;domain adaptation&#xff09; 思想的神经网络结构&#xff0c;主要用于不同数据域之间的知识迁移&#xff0c;尤其是在…

【C语言】深入理解预处理

文章目录一、预定义符号二、#define定义常量&#xff1a;便捷的符号替换常见用法示例&#xff1a;注意事项&#xff1a;三、#define定义宏&#xff1a;带参数的文本替换关键注意点&#xff1a;四、带有副作用的宏参数五、宏替换的规则&#xff1a;预处理的执行步骤重要注意&…

展锐平台(Android15)WLAN热点名称修改不生效问题分析

前言 在展锐Android V项目开发中&#xff0c;需要修改softAp/P2P热点名称时&#xff0c;发现集成GMS后直接修改framework层代码无效。具体表现为&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法编译烧录后修改不生效 问题根源在…

wsl ubuntu访问(挂载)vmware vmdk磁盘教程

之前使用VMware Workstation 虚拟机跑了个ubuntu&#xff0c;现在改用wsl了&#xff0c; 想把vmware的磁盘挂载到wsl ubuntu。一、磁盘合并我原先的vmware跑的ubuntu存在多个vmdk文件&#xff08;磁盘文件&#xff09;&#xff0c;需要先将磁盘合并成一个才方便挂载。首先你电脑…

UGUI源码剖析(3):布局的“原子”——RectTransform的核心数据模型与几何学

UGUI源码剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心数据模型与几何学 在前几章中&#xff0c;我们了解了UGUI的组件规范和更新调度机制。现在&#xff0c;我们将深入到这个系统的“几何学”核心&#xff0c;去剖析那个我们每天都在…

c++注意点(15)----设计模式(桥接模式与适配器模式)

一、结构型设计模式两者有点相似&#xff0c;都是为了做到解耦的功能。适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&…

DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!

作为我常用的一款还不错的跨境工具&#xff0c;DuoPlus云手机帮我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和优化&#xff0c;今天来聊聊它最近新更新的一些功能。功能更新一览新增导入文件配置参数&#xff1a;批量初始化代理、批量修改参数支持导入文件一键配…

PLC如何实现通过MQTT协议物联网网关接入管理云平台

在工业4.0与智能制造浪潮下&#xff0c;企业亟需实现设备数据的高效采集与云端协同&#xff0c;以支撑远程监控、预测性维护等场景。工业智能网关凭借其强大的协议解析能力、边缘计算功能及安全传输机制&#xff0c;成为PLC接入云平台的核心解决方案。本文将从技术架构、功能模…