「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
给你一个整数数组 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 指数
如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻