h-index计算解法
leetcode 274:
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。计算并返回该研究者的 h
指数。
根据维基百科上 h 指数的定义:h
代表“高引用次数” ,一名科研人员的 h
指数 是指他(她)至少发表了 h
篇论文,并且 至少 有 h
篇论文被引用次数大于等于 h
。如果 h
有多种可能的值,h
指数 是其中最大的那个。
题目解析
这道题我也看了蛮久,做着做着才明白它的题意,它的题意大概是这样:
从大到小上来看,可以统计到:
有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的最大值。
怎么知道有几个数字不小于当前索引?实际上,用排序就可以完成。
接下来就可以写代码了:
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