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

一、题目描述

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

根据维基百科上 h 指数的定义h 代表"高引用次数" ,一名科研人员的 h指数 是指他(她)至少发表了 h 篇论文,并且 至少h 篇论文被引用次数大于等于 h 。如果 h有多种可能的值,h 指数是其中最大的那个。

示例 1:

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

示例 2:

复制代码
输入:citations = [1,3,1]
输出:1

提示:

  • n == citations.length
  • 1 <= n <= 5000
  • 0 <= citations[i] <= 1000

二、解题思路

  1. 首先对数组进行降序排序。
  2. 遍历排序后的数组,寻找满足条件的最长序列:序列中的每个元素的值都大于或等于序列的长度。
  3. 该序列的长度即为所求的 h 指数。

三、具体代码

java 复制代码
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++) {
            // 从后往前遍历,检查当前索引位置的值是否大于等于剩余论文的数量
            if (citations[n - 1 - i] < i + 1) {
                return i;
            }
        }
        // 如果所有论文的引用次数都大于等于论文的数量,则 h 指数为论文的数量
        return n;
    }
}

代码解析:

  1. 使用 Arrays.sort(citations); 对数组进行升序排序,因为 Java 默认的排序是升序的。
  2. 使用一个 for 循环,从 0 开始遍历数组。
  3. 在循环内部,通过 citations[n - 1 - i] 访问降序排列后的元素(由于是升序排序,所以从后往前遍历相当于降序)。
  4. 检查当前元素的值是否小于其位置索引加 1(位置索引加 1 表示至少有这么多篇论文的引用次数大于等于这个数)。
  5. 如果当前元素的值小于位置索引加 1,则找到了 h 指数,返回索引值。
  6. 如果遍历结束都没有找到这样的值,则 h 指数为论文总数,返回 n。

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

1. 时间复杂度
  • 排序操作:Arrays.sort(citations); 通常使用的是快速排序或归并排序,其平均时间复杂度为 O(n log n),其中 n 是数组 citations 的长度。
  • for 循环:循环遍历整个数组一次,时间复杂度为 O(n)。

因此,总的时间复杂度是 O(n log n) + O(n),可以简化为 O(n log n),因为 O(n log n) 是主导项。

2. 空间复杂度
  • 排序操作:如果使用的是原地排序算法(如快速排序),则除了输入数组外,只需要常数级别的额外空间,即 O(1)。
  • for 循环:只使用了几个额外的变量(如 n 和循环变量 i),这些变量占用的空间是常数级别的,即 O(1)。

因此,总的空间复杂度是 O(1),表示算法在执行过程中使用了固定的额外空间,与输入数组的大小无关。

五、总结知识点

  1. 类定义class Solution:定义了一个名为 Solution 的类。

  2. 方法定义public int hIndex(int[] citations):定义了一个名为 hIndex 的公共方法,它接受一个整数数组 citations 作为参数,并返回一个整数。

  3. 数组排序Arrays.sort(citations);:使用 java.util.Arrays 类中的 sort 方法对整数数组 citations 进行排序。默认情况下,这个方法按照升序对数组进行排序。

  4. 变量声明和初始化int n = citations.length;:声明了一个整型变量 n 并将其初始化为数组 citations 的长度。

  5. 循环结构for (int i = 0; i < n; i++):使用 for 循环结构遍历数组。变量 i 从 0 开始,每次循环递增,直到它小于 n

  6. 条件判断if (citations[n - 1 - i] < i + 1):在 for 循环内部使用 if 语句进行条件判断。这里检查的是数组中从后往前数的第 i 个元素的值是否小于 i + 1

  7. 数组元素访问citations[n - 1 - i]:通过索引访问数组元素。由于数组是升序排序的,所以 n - 1 - i 实际上是从后往前访问数组。

  8. 方法返回值return i;return n;:根据条件判断的结果,方法返回一个整数值,表示 h 指数。

  9. 算法逻辑:代码实现了 h 指数的计算逻辑,即找到至少有 h 篇论文,每篇论文被引用次数至少为 h 的最大 h 值。

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

相关推荐
清梦202013 分钟前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar35 分钟前
速通Python 第四节——函数
开发语言·python·算法
星河梦瑾37 分钟前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富41 分钟前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想42 分钟前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
Altair澳汰尔1 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列