问题描述
你需要计算一个研究者的 h 指数。h 指数的定义是:一个研究者至少发表了 h 篇论文,并且这些论文中至少有 h 篇论文的引用次数大于等于 h。h 指数是所有可能的 h 值中最大的那个。
输入
- 一个整数数组
citations,其中citations[i]表示研究者的第 i 篇论文被引用的次数。
输出
- 一个整数,表示研究者的 h 指数。
示例
示例 1:
- 输入:
citations = [3, 0, 6, 1, 5] - 输出:
3 - 解释: 研究者有 5 篇论文,其中 3 篇论文的引用次数至少为 3 次(分别是 3, 6, 5),所以 h 指数是 3。
示例 2:
- 输入:
citations = [1, 3, 1] - 输出:
1 - 解释: 研究者有 3 篇论文,其中 1 篇论文的引用次数至少为 1 次(分别是 1, 3, 1),所以 h 指数是 1。
解题思路
首先对 citations 数组进行降序排序,排序是为了省掉比大小的麻烦。然后从排序后的数组中遍历,对于每个位置 i,检查 citations[i],主要是为了验证被引指数和被引论文数量的关系。然后找到最大的 i,返回即可。下面先给出核心代码,再根据代码解释分析。
如有错误,欢迎指正交流
核心代码
def hIndex(self, citations):
"""
:type citations: List[int]
:rtype: int
"""
citations.sort(reverse=True)
n = len(citations)
h = citations[0]
time = 0
for item in citations:
# 下一篇引用和当前统计的一样,满足条件的文章+1
# 下一篇引用小于当前统计的一样,需要更新h,同时满足条件的文章+1
if item < h and item != 0:
h = item
# 如果time开始反超h,说明前面满足的time就是h
if time > h:
return time
if item != 0:
time += 1
# 每轮循环过后,判断是否满足h指数条件
if time >= h and n >= h:
return h
# 如果上面的循环结束了还没找到H指数,直接返回 t
return time
代码分析
首先,要对被引的列表进行排序处理,排序是为了方便处理被引量和被引文章数的关系。我们可以这样考虑,从左到右依次处理i,若第i篇引用数量大于等于和目前的最高被引量,满足条件的文章+1;若引用小于当前统计的一样,需要更新h(为当前的h,因为排过序了,所以左侧的都满足),同时满足条件的文章+1。除了没有被引的文章,至少引用1次的都会计入被引文章,所以当被引次数降至1时,就退化成了被引过的文章计数。最后返回最大值即可。