题目
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。计算并返回该研究者的 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
class Solution { public int hIndex(int[] citations) { Arrays.sort(citations); int h=0; int i= citations.length-1; while(i>=0 && citations[i]>h){ i--; h++; } return h; } }
详细解读
让我们逐行解读这段代码:
Arrays.sort(citations);
- 首先,对引用次数数组citations
进行升序排序。这是为了方便后续的计算。int h = 0;
- 初始化h
为0,表示初始的H指数。int i = citations.length - 1;
- 初始化变量i
为数组的最后一个元素的索引,即最大引用次数的索引。- 进入
while
循环,条件i >= 0 && citations[i] > h
表示只要当前论文的引用次数大于h
且还有论文可以考虑,就继续循环。 i - -;
- 每次循环,将i
减1,表示考虑下一篇引用次数更低的论文。h++;
- 同时,将h
增加1,表示考虑了一篇引用次数至少为h
的论文。- 循环继续,直到不再满足循环条件,这意味着没有更多的论文可以考虑或者当前的引用次数已经不足以使
h
继续增加。 - 最终,返回
h
,它代表了H指数,即最大的h
值,使得至少有h
篇论文的引用次数不低于h
。
这段代码的时间复杂度主要来自数组的排序,排序算法的时间复杂度为 O(nlogn),其中 n 是引用次数数组的长度。然后,在循环中遍历数组,所以总体时间复杂度是 O(nlogn)。这个算法有效地解决了H指数问题,找到了最大的 h
值。