【LeetCode】274. H 指数
解题思路
H 指数的核心定义是:研究者的 h 指数是最大的满足至少 h 篇论文被引用至少 h 次的值,且剩余的论文引用次数不超过 h。可以通过以下步骤高效计算:
- 排序优化:将论文引用次数降序排列,方便快速判断每篇论文的引用次数是否满足条件。
- 贪心遍历:遍历排序后的数组,找到最大的
i+1(即 h 候选值),使得前i+1篇论文的引用次数均至少为i+1。
关键步骤
- 降序排序:将数组按引用次数从高到低排序。
- 遍历验证:依次检查每个位置
i,若citations[i] >= i+1,则当前i+1是一个候选的 h 值。由于数组已排序,一旦遇到不满足条件的位置,后续的值一定更小,可以直接终止遍历。 - 返回最大值:遍历过程中记录最大的
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 }
代码解析
- 降序排序:通过
sort.Slice实现降序排列,将高引用论文集中在数组前端。 - 贪心遍历:遍历排序后的数组,若当前论文引用次数
>= i+1,则更新 h 值。例如,在示例1中:- 排序后数组为
[6,5,3,1,0]。 - 当
i=2时,citations[2]=3 >= 3,此时h=3。
- 排序后数组为
- 提前终止:一旦发现
citations[i] < i+1,后续元素更小,直接终止遍历以优化性能。

浙公网安备 33010602011771号