目录
1,题目
2,代码
2.1排序
2.2计数排序
3,学习与总结
3.1排序实现的学习总结
3.2计数排序的学习总结
1,题目
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。计算并返回该研究者的 h
指数。
根据维基百科上 h 指数的定义:h
代表“高引用次数” ,一名科研人员的 h
指数 是指他(她)至少发表了 h
篇论文,并且 至少 有 h
篇论文被引用次数大于等于 h
。如果 h
有多种可能的值,h
指数 是其中最大的那个。
2,代码
2.1排序
/**
* @param {number[]} citations
* @return {number}
*/
var hIndex = function(citations) {
citations.sort((a,b)=>a-b);
let h = 0;
let i = citations.length - 1;
while(i >= 0 && citations[i] > h){
h++;
i--;
}
return h;
};
2.2计数排序
/**
* @param {number[]} citations
* @return {number}
*/
var hIndex = function(citations) {
// 计数排序
let n = citations.length;
let total = 0;
const counter = new Array(n+1).fill(0);
for(let i = 0; i < n; i++){
if(citations[i] > n){
counter[n]++;
}else{
counter[citations[i]]++;
}
}
for(let i = n;i>=0;i--){
total+=counter[i];
if(total >= i){
return i;
}
}
return 0;
};
3,学习与总结
3.1排序实现的学习总结
实现的核心:
在于 排序之后,从最大项开始判断
缺点:
算法的时间复杂度和空间复杂度都依赖排序算法的实现;
3.2计数排序的学习总结
citations数组是每篇论文的引用次数,这里使用counter数组来计算被引用0~n次的论文分别有多少篇,这个方法经常使用;
注意:
论文共有n篇,根据h指数的定义,对于被引用次数大于n的,进行特殊处理,将其统计到引用次数为n的对应数组项中;
const counter = new Array(n+1).fill(0);
for(let i = 0; i < n; i++){
if(citations[i] > n){
counter[n]++;
}else{
counter[citations[i]]++;
}
}
重点在于积累与学习实现的逻辑!