题目描述
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 **h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。
例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。
提示: 如果 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.length1 <= n <= 50000 <= citations[i] <= 1000
解题思路
本题其实并不困难,只是这个题意理解起来会有点绕,这里我们抓住重点即可。
如果说有 h 篇论文,它们的引用次数大于等于 h 次,那这个 h 就是一个合法的 h,而 h 指数就是所有满足条件的 h 值中最大的那一个。
那这个题怎么解呢?
这里我们可以首先对输入数组进行排序,以示例1 中数据为例,排序后的结果如下:
[0,1,3,5,6]
那排序的作用是什么呢?我们接着往下看。
此时我们从后向前的扫描排序后的数组,并记录当前的 h 值。初始的时候,我们定义 h = 1,此时位置在数组的末尾。
1
[0,1,3,5,6]
接下来我们判断数组当前位置的值(也就是引用次数),是否大于等于当前的 h,如果满足条件,说明我们找到了 h 篇论文,并且它们的引用次数大于等于 h,那么此时的 h 值就是一个合法的 h 值。
接下来我们继续向前查找,当我们找到了一个不合法的位置的时候,就可以退出循环了,而我们最后找到的合法的 h 值,就是最大的合法的 h 值,也就是我们要求的 H 指数。
代码实现
var hIndex = function (citations) {
citations = citations.sort((a, b) => a - b);
let h = 1, n = citations.length;
while (h <= n && citations[n - h] >= h) ++h;
// 非法指数
h -= 1;
return h;
};
至此我们就完成了leetcode-274-H 指数