青训营AI刷题 遍历 高被引指数计算 | 豆包MarsCode AI刷题

71 阅读2分钟

问题描述

你需要计算一个研究者的 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时,就退化成了被引过的文章计数。最后返回最大值即可。