[路飞]_274. H 指数

224 阅读2分钟

「这是我参与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
    }
};