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

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

相关推荐
星空露珠6 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_832402757 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉15 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526117 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_7634724617 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
毕设源码-邱学长18 分钟前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
依依yyy22 分钟前
沪深300指数收益率波动性分析与预测——基于ARMA-GARCH模型
人工智能·算法·机器学习
摇滚侠33 分钟前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言
踩坑记录35 分钟前
leetcode hot100 23. 合并 K 个升序链表 hard 分治 迭代
leetcode·链表
€8111 小时前
Java入门级教程24——Vert.x的学习
java·开发语言·学习·thymeleaf·数据库操作·vert.x的路由处理机制·datadex实战