[路飞]_leetcode-274-H 指数

简介: leetcode-274-H 指数

网络异常,图片无法展示
|


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


[题目地址][B站地址]


给你一个整数数组 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.sort((a, b) => a - b)
  // 获取数组的长度
  let len = citations.length,
  // 初始化 h 指数为 1
    h = 1
  // 当当前位置的论文引用次数大于等于后续的论文数量的时候
  // 说明当前 h 合法(当前位置及后续的所有论文引用次数都大于h,且当前位置和后续数量为h)
  while (citations[len - h] >= h) h++
  // while 循环终止,找到了第一个不合法的位置,返回结果为 h-1
  return h - 1
}
复制代码


至此我们就完成了 leetcode-274-H 指数


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章