Leetcode 274. H指数
题目
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。
例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。
提示:如果 h 有多种可能的值,h 指数 是其中最大的那个。
解题思路1
首先一定要读懂题意。我们设num_h是被引用论文的数量,同时它表示总共有num_h篇论文分别被至少引用了num_h次;num_frequecy是论文引用次数超过num_h的论文的篇数。我们就是要在这两个数字里进行比较。只要高引用论文次数(num_frequency)大于等于高引用论文数量(num_h),那么我们认为高引用指数index=num_h,否则我们推出循环。
还有一个易错点就是num_h的取值,它的取值是从0到num,而不是num-1
解题思路2
先对容器进行排序。那么容器中元素的索引代表的就是num_h,容器中的元素代表的就是num_frequency。比较它俩的值,我们便可以计算出H值。
代码块
class Solution {
public:
int hIndex(vector<int>& citations) {
int num=citations.size();//学者的论文数
//1.高引用指数绝对不会大于论文数,那么最笨的方法就是从0开始遍历
//2.需要比较两个数的大小,第一个就是高引用论文次数,另一个就是高引用论文数量
//3.要注意一点,不同论文被引用的次数会有相同的情况
/*4.以上全是废话,实际情况是根本不需要区分第3点所讲的情况。只要高引用论文次数(num_frequency)大于等于
高引用论文数量(num_h),那么我们认为高引用指数index=num_h。
还有一个易错点就是num_h的取值,它的取值是从0到num,而不是num-1
*/
int num_h,num_frequency;
int index=0;
int same=0;
for(num_h=0;num_h<=num;++num_h){
num_frequency=0;same=0;
for(int i=0;i<num;++i){
if(citations[i]>=num_h){
++num_frequency;//统计的是论文引用次数大于论文本身数量的次数
}
/*else if(citations[i]==num_h){
++same;//统计的是论文引用次数等于论文本身数量的次数
}*/
}
/* //实际的论文引用次数 大于 等于 论文本身数量的次数=num_frequency+same
if(same==1){
num_frequency=num_frequency+1>num_h?num_h:num_frequency;
}else if(same>1){
num_frequency=num_frequency+same>num_h?num_h:num_frequency;
}*/
if(num_frequency>=num_h){
index=num_h;
}else if(num_frequency<num_h){
break;
}
}
return index;
}
};