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 值。

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

相关推荐
小林熬夜学编程20 分钟前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程序员阿龙32 分钟前
基于SpringBoot的医疗陪护系统设计与实现(源码+定制+开发)
java·spring boot·后端·医疗陪护管理平台·患者护理服务平台·医疗信息管理系统·患者陪护服务平台
躺不平的理查德44 分钟前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
前 方1 小时前
若依入门案例
java·spring boot·maven
阿洵Rain1 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
姜西西_1 小时前
动态规划 之 斐波那契数列模型 算法专题
算法·动态规划
funnyZpC1 小时前
quartz集群增强版🎉
java·分布式·开源·集群·定时任务
阿华的代码王国1 小时前
【Spring】——SpringBoot项目创建
java·spring boot·后端·启动类·target文件
stormjun1 小时前
Java基于微信小程序的私家车位共享系统(附源码,文档)
java·微信小程序·共享停车位·私家车共享停车位小程序·停车位共享
格里菲斯8581 小时前
算法练习记录
算法