算法升级之路(四)

274. H 指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。如果 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

解题思路:

先将数组进行排序,倒序遍历数组,设置h的初始值为0,如果数组中的值大于h,说明我们又找到了一个被引用了至少h次的论文,那么h+1;

对于[3,0,6,1,5] 排序后 [0,1,3,5,6]

当 h =0时,查找到6>0,h+1=1;
h =1;查找5>1,h+1 =2;
h=2,查找到3>2,h+1=3;
h=3,查找到1<3,退出循环;

另外h并不总是数组中的数,h一定是等于小于数组的长度的。

public int hIndex(int[] citations) {
        Arrays.sort(citations);
    
        int n = citations.length-1;
        int h =0;
        while(n>=0){
            if(citations[n]>h){
                h++;
            }
            n--;
        }
        return h;

    }
计数法思路:

设citations的长度为n
声明一个数组 arr,数组的长度为n+1,用来存放从0到citations长度的数,出现的次数。
对于[3,0,6,1,5] ,新建数组的长度就应该是6,
另外因为h一定是【0,n】其中的一个数,
所以大于等于n的数的数量都加在arr[n]中,其他放入对应位置

该数对应的数量 0 1 2 3 n+大于n的数的数量
存放位置 arr[0] arr[1] arr[2] arr[3] arr[n]

例如[3,0,6,1,5] ,对应新建的数组就是
1 1 0 1 0 1 1

计算h时需要,倒序循环该数组,将数组中的数相加,当和大于数组的下标时,返回该下标

你可能感兴趣的:(算法刷题,算法,数据结构)