h-index计算解法

28

leetcode 274:

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

根据维基百科上 h 指数的定义h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。

题目解析

这道题我也看了蛮久,做着做着才明白它的题意,它的题意大概是这样:

image-lsbu.png

从大到小上来看,可以统计到:

有1个数不小于6

有2个数不小于5

有3个数不小于3

有4个数不小于1

有5个数不小于0

但是题目要求的是满足有h个数不小于h啊?那就看一下:

6个数不小于6?(不成立)

5个数不小于5?(不成立)

3个数不小于3? (成立)

1个数不小于1?(成立)

0个数不小于0? (成立)

可以看到,实际上就是从3,1,0中取最大的那个数,这个数组的hindex就是 3

所以,在取每一个index的时候,需要尽量满足有h个数不小于h

比如:遍历到6这个值的时候,我们知道只有它自己是6,所以取min(1,6)= 1,6遍历完之后,我们就知道,至少有1个数不小于1

接下来就是在每轮循环中比较a个数不小于b,取a,b的最小值h,然后记录h的最大值。

怎么知道有几个数字不小于当前索引?实际上,用排序就可以完成。

image-ever.png

接下来就可以写代码了:

class Solution:
    def hIndex(self, citations: List[int]) -> int:
        h_index = 0
        length = len(citations)
        citations.sort(reverse=True)
        for index in range(length):
            tmp = min(citations[index], index + 1)
            h_index = max(tmp, h_index)
        return h_index