【LeetCode】274. H 指数

leetcode

 

解题思路

H 指数的核心定义是:研究者的 h 指数是最大的满足至少 h 篇论文被引用至少 h 次的值,且剩余的论文引用次数不超过 h。可以通过以下步骤高效计算:

  1. 排序优化:将论文引用次数降序排列,方便快速判断每篇论文的引用次数是否满足条件。
  2. 贪心遍历:遍历排序后的数组,找到最大的 i+1(即 h 候选值),使得前 i+1 篇论文的引用次数均至少为 i+1。

关键步骤

  1. 降序排序:将数组按引用次数从高到低排序。
  2. 遍历验证:依次检查每个位置 i,若 citations[i] >= i+1,则当前 i+1 是一个候选的 h 值。由于数组已排序,一旦遇到不满足条件的位置,后续的值一定更小,可以直接终止遍历。
  3. 返回最大值:遍历过程中记录最大的 i+1 作为最终结果。

复杂度分析

  • 时间复杂度:O(n log n),主要由排序步骤决定。
  • 空间复杂度:O(1),排序为原地操作,仅需常数空间。

Golang 代码实现

package main

import (
    "sort"
)

func hIndex(citations []int) int {
    n := len(citations)
    if n == 0 {
        return 0
    }
    // 降序排序
    sort.Slice(citations, func(i, j int) bool {
        return citations[i] > citations[j]
    })
    
    maxH := 0
    for i := 0; i < n; i++ {
        if citations[i] >= i+1 {
            maxH = i + 1
        } else {
            break // 后续元素更小,无需继续判断
        }
    }
    return maxH
}

运行示例

func main() {
    // 示例1
    citations1 := []int{3, 0, 6, 1, 5}
    fmt.Println(hIndex(citations1)) // 输出: 3

    // 示例2
    citations2 := []int{1, 3, 1}
    fmt.Println(hIndex(citations2)) // 输出: 1
}

代码解析

  1. 降序排序:通过 sort.Slice 实现降序排列,将高引用论文集中在数组前端。
  2. 贪心遍历:遍历排序后的数组,若当前论文引用次数 >= i+1,则更新 h 值。例如,在示例1中:
    • 排序后数组为 [6,5,3,1,0]
    • 当 i=2 时,citations[2]=3 >= 3,此时 h=3
  3. 提前终止:一旦发现 citations[i] < i+1,后续元素更小,直接终止遍历以优化性能。
posted @ 2025-03-27 13:51  云隙之间  阅读(53)  评论(0)    收藏  举报