[路飞]_程序员必刷力扣题: 274. H 指数

156 阅读1分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

274. H 指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

根据维基百科上 h 指数的定义:h 代表“高引用次数”,一名科研人员的 h指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - 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指数的规则来找出这写论文的最大H指数

如果有1篇文章引用次数大于等于1,那么H最小为1

如果有2篇文章引用次数大于等于2,那么H最小为2

...

最后返回最大的H指数

跟据这个规则,我们可以发现题目中的引用次数和排序没有关系,我们只需要找最大H指数即可

但是H指数和排序缺有关系

因为我们要统计最大H指数,如果从大到小排序,我们每个元素如果符合当前要求就让H++

要符合什么要求呢?

0位的引用最少为1才会使H++,所以可以得到关系citations[i]>i

1位的引用最少为2才会使H++

...

由此我们找到了寻找最大H的方法

具体步骤:

  • 我们首先需要对数组进行降序排序,这里直接使用sort
  • 遍历数组,如果满足citations[i]>i的条件,那么H++
  • 如果不满足 citations[i]>i,那么后续的元素citations[i]会更小,i会更大,不会再有符合的条件的情况,所以直接break终止循环

最后返回H即可

var hIndex = function(citations) {
    citations.sort((a,b)=>b-a)
    var h = 0
    for(var i = 0;i < citations.length;i++){
        if(citations[i]>i){
            h = i+1
        }else{
            break
        }
    }
    return h
};