一、题目描述
给你一个整数数组 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
二、解题思路
- 首先对数组进行降序排序。
- 遍历排序后的数组,寻找满足条件的最长序列:序列中的每个元素的值都大于或等于序列的长度。
- 该序列的长度即为所求的 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;
}
}
代码解析:
- 使用
Arrays.sort(citations);
对数组进行升序排序,因为 Java 默认的排序是升序的。 - 使用一个 for 循环,从 0 开始遍历数组。
- 在循环内部,通过
citations[n - 1 - i]
访问降序排列后的元素(由于是升序排序,所以从后往前遍历相当于降序)。 - 检查当前元素的值是否小于其位置索引加 1(位置索引加 1 表示至少有这么多篇论文的引用次数大于等于这个数)。
- 如果当前元素的值小于位置索引加 1,则找到了 h 指数,返回索引值。
- 如果遍历结束都没有找到这样的值,则 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),表示算法在执行过程中使用了固定的额外空间,与输入数组的大小无关。
五、总结知识点
-
类定义 :
class Solution
:定义了一个名为Solution
的类。 -
方法定义 :
public int hIndex(int[] citations)
:定义了一个名为hIndex
的公共方法,它接受一个整数数组citations
作为参数,并返回一个整数。 -
数组排序 :
Arrays.sort(citations);
:使用java.util.Arrays
类中的sort
方法对整数数组citations
进行排序。默认情况下,这个方法按照升序对数组进行排序。 -
变量声明和初始化 :
int n = citations.length;
:声明了一个整型变量n
并将其初始化为数组citations
的长度。 -
循环结构 :
for (int i = 0; i < n; i++)
:使用for
循环结构遍历数组。变量i
从 0 开始,每次循环递增,直到它小于n
。 -
条件判断 :
if (citations[n - 1 - i] < i + 1)
:在for
循环内部使用if
语句进行条件判断。这里检查的是数组中从后往前数的第i
个元素的值是否小于i + 1
。 -
数组元素访问 :
citations[n - 1 - i]
:通过索引访问数组元素。由于数组是升序排序的,所以n - 1 - i
实际上是从后往前访问数组。 -
方法返回值 :
return i;
和return n;
:根据条件判断的结果,方法返回一个整数值,表示 h 指数。 -
算法逻辑:代码实现了 h 指数的计算逻辑,即找到至少有 h 篇论文,每篇论文被引用次数至少为 h 的最大 h 值。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。