leetcode 274. H指数 medium
题目描述:
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。
h 指数的定义: h_index代表有h篇论文的引用次数至少为h次。h指数为最大的h_index
解题思路:
h指数的取值范围是0~nums.size()
解法1: wiki上的解法 O(nlogn)
1、将其发表的所有SCI论文按被引次数从高到低排序;2、从前往后查找排序后的列表,如果nums【i】>i,说明第0 到 i 篇论文都有至少 i+1次引用,因此我们只要找到最大的 i满足nums【i】>i,那么h指数即为i+1。
解法2:计数排序 O(n)
利用到的结论是如果一篇文章的引用次数超过论文的总数 n,那么将它的引用次数降低为 n 也不会改变 h指数的值。
代码:
// 排序
class Solution {
public:
int hIndex(vector<int>& nums) {
if(nums.empty())
return 0;
int res=-1;
sort(nums.begin(),nums.end(),greater<int>());
for(int i=0;i<nums.size();++i){
if(nums[i]>i)
res=i;
else
return res+1;
}
return res+1;
}
};
// 计数
class Solution {
public:
int hIndex(vector<int>& nums) {
if(nums.empty())
return 0;
int n=nums.size();
vector<int> count(n+1,0);
for(auto i:nums) // 计数
count[min(n,i)]++;
for(int i=nums.size();i>0;--i){
if(count[i] >=i)
return i;
count[i-1] += count[i]; //累加到下一个
}
return 0;
}
};