H-Index,LeetCode,274

H-Index 是衡量科学家或学者学术影响力的一种指标,它基于其发表论文的引用次数。具体来说,一个学者的 H-Index 是指他/她有 H 篇论文,每篇论文至少被引用了 H 次。

LeetCode 是一个在线编程平台,提供了大量的编程题目,帮助程序员提升编程能力和准备技术面试。LeetCode 上的题目涵盖了算法、数据结构、数据库、Shell 脚本等多个领域。

题目编号 274 在 LeetCode 上对应的是“H-Index”问题。这个问题的描述如下:

题目描述: 给定一位研究者论文的引用次数数组(每个元素表示一篇论文的引用次数),请计算该研究者的 H-Index。

示例: 输入: citations = [3, 0, 6, 1, 5] 输出: 3 解释: 该研究者有 5 篇论文,每篇论文至少被引用了 3 次,所以 H-Index 是 3。

解题思路:

  1. 排序法
    • 首先将引用次数数组进行排序(降序)。
    • 遍历排序后的数组,找到第一个满足条件的索引 i,使得 citations[i] >= i + 1,此时 i + 1 就是 H-Index。
  2. 计数法
    • 创建一个长度为 n + 1 的数组 count,其中 count[i] 表示引用次数为 i 的论文数量。
    • 遍历引用次数数组,填充 count 数组。
    • 从后向前累加 count 数组的值,找到第一个满足条件的索引 i,使得累加值 >= i,此时 i 就是 H-Index。

代码实现(排序法):

def hIndex(citations): citations.sort(reverse=True) n = len(citations) for i in range(n): if citations[i] >= i + 1: continue else: return i return n

示例

citations = [3, 0, 6, 1, 5] print(hIndex(citations)) # 输出: 3

代码实现(计数法):

def hIndex(citations): n = len(citations) count = [0] * (n + 1) for citation in citations: if citation >= n: count[n] += 1 else: count[citation] += 1

total = 0
for i in range(n, -1, -1):
    total += count[i]
    if total >= i:
        return i
return 0

示例

citations = [3, 0, 6, 1, 5] print(hIndex(citations)) # 输出: 3

这两种方法各有优缺点:

  • 排序法:思路简单,但时间复杂度为 O(n log n)。
  • 计数法:时间复杂度为 O(n),但需要额外的空间来存储计数数组。

选择哪种方法取决于具体的应用场景和对时间、空间复杂度的要求。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注