「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
274. H 指数
题目
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。
例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。
提示:如果 h 有多种可能的值,h 指数 是其中最大的那个。
说明
- 如果作者发1篇论文,引用超过1次以上,无论多少;h为1
- 如果作者发布2篇论文,1篇引用1000,另一片引用0;h也就是1
- 如果作者发布2篇论文,1篇引用1000,另一片引用1或者2;h是2;
- h一定是论文数量,h篇论文,每一篇论文必需引用h+次
示例
输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
题解
全排序
既然h的定义是:h 篇论文分别被引用了至少 h 次;假设现在有数组citations = [3,0,6,1,5];
首先对数组从大到小排列,可以得到数组citations = [6,5,3,1,0];
将排序好的数组从左到右枚举。定义h初始值为0;
如果当前引用次数大于h;h增加;继续下一数据;枚举过程中h大于当前引用数,返回答案
分析算法复杂度;排序需要O(nlogN)
按照上述思路编辑代码如下
代码
var hIndex = function(citations) {
const len = citations.length
citations.sort((a,b)=>b-a);
let result = 0
for(let i = 0 ; i < len ; i++){
if(citations[i] > result){
result++;
}else{
break
}
}
return result
};
计数排序
上述方法需要排序,最低时间复杂度为O(nLogN);通过上述解题思路可以明白解决本题跟排序
var hIndex = function(citations) {
const len = citations.length
const list = Array(len+1).fill(0);
for(let i = 0 ; i < len ; i++){
if(citations[i] > len){
list[len]+=1
}else{
list[citations[i]]+=1
}
}
let t = 0
for(let i = len ; i >=0 ;i--){
t+=list[i];
if(t >= i) return i
}
};