[路飞]_leetcode-274-H 指数

201 阅读1分钟

题目描述

[题目地址]

给你一个整数数组 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.length
  • 1 <= n <= 5000
  • 0 <= 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 指数