1、题目描述
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数 不超过 h 次。)
例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。
提示:如果 h 有多种可能的值,h 指数是其中最大的那个。
2、示例
输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
3、题解
解法一:
基本思想:排序,时间复杂度O(nlogn)空间复杂度O(1)
解法二:
基本思想:计数,时间复杂度O(n)空间复杂度O(n)
如果一篇文章的引用次数超过论文的总数n,那么将它的引用次数降低为n 也不会改变h 指数的值
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int hIndex(vector<int>& citations) {
//基本思想:排序,时间复杂度O(nlogn)空间复杂度O(1)
int res = 0;
sort(citations.begin(),citations.end(),[](const int v1,const int v2){return v1>v2;});
for(int i=0;i<citations.size();i++)
{
if(citations[i]>=i+1 && res < i+1)
res=i+1;
}
return res;
}
};
class Solution1 {
public:
int hIndex(vector<int>& citations) {
//基本思想:计数,时间复杂度O(n)空间复杂度O(n)
//如果一篇文章的引用次数超过论文的总数n,那么将它的引用次数降低为n 也不会改变h 指数的值
int n=citations.size();
vector<int> cnt(n+1,0);
for(int i=0;i<n;i++)
{
if(citations[i]>n)
cnt[n]++;
else
cnt[citations[i]]++;
}
for(int i=n;i>=1;i--)
{
if(cnt[i]>=i)
return i;
cnt[i-1]+=cnt[i];
}
return 0;
}
};
int main()
{
Solution1 solute;
vector<int> num={0};
cout<<solute.hIndex(num)<<endl;
return 0;
}