【附JS、Python、C++题解】Leetcode面试150题(11)H指数

发布于:2025-04-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、题目

274. H 指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数

根据维基百科上 h 指数的定义h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。

示例 1:

输入:citations = [3,0,6,1,5]输出:3 
解释:给定数组表示研究者总共有5篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5次。由于研究者有3篇论文每篇至少被引用了3次,其余两篇论文每篇被引用不多于3次,所以她的 h 指数是 3。

示例 2:

输入:citations = [1,3,1]
输出:1

二、思路

1. 在这个问题中我们需要确定的几个数字:

  • 论文总篇数:元素个数(数组长度)l = citations.length
  • 论文引用数:元素值 n = citations[i]
  • 找到“至少”:我们需要找到一个值 h,使得至少有 h 篇论文被引用次数大于等于 h
  • 确认是否满足条件:检查是否有至少 h 篇论文的引用次数大于等于 h
  • h 指数:满足上述条件的最大值 h

那基本的判断逻辑已经确定:

  • 首先,对 citations 数组进行排序,这样可以更方便地计算 h 指数。
  • 从排序后的数组的末尾开始遍历,计算当前的 h 值。l - i 表示当前的 h 值,citations[i] 表示当前论文的引用次数。
  • 如果 citations[i] 大于等于 l - i,说明当前的 h 值满足条件,记录下来并退出循环。
  • 如果遍历完整个数组都没有找到满足条件的 h 值,返回 0。

三、代码

① JavaScript:

function getHIndex(citations){
    let l = citations.length;
    citations.sort((a,b)=>a-b);
    // 自定义升序排列,传递一个比较函数作为参数
    for(let i =0; i<l; i++){
        if(citations[i]>=l-i){
            return l-i;
        }
    }
    return 0;
}

② python: 

def h_index(citations):
    citations.sort()  # 对引用次数进行排序
    l = len(citations)
    h = 0
    for i in range(l):
        if citations[i] >= l - i:
            h = l - i
            break
    return h

③ C++:

int getHIndex(const std::vector<int>& citations) {
    std::vector<int> sortedCitations = citations;  // 创建一个副本进行排序
    std::sort(sortedCitations.begin(), sortedCitations.end());  // 对引用次数进行排序
    int l = sortedCitations.size();
    for (int i = 0; i < l; i++) {
        if (sortedCitations[i] >= l - i) {
            return l - i;
        }
    }
    return 0;  // 如果没有满足条件的 h 值,返回 0
}

四、反思

1.刚开始的思路是从最小的元素开始判断,但是发现如果最小的元素并不满足要求,还得找到第二小的元素再来一遍,想到之前用到的简化方法——先排序再处理。(如下面这道题)

【附JS、Python、C++题解】Leetcode面试150题(9)——三数之和-CSDN博客

2.  将题目条件归纳到数学式子中,什么时候h满足条件?citations[i] >= l-i 的时候。