有点绕的一个题,题目描述的有点奇怪(可以看下英文?)
题型:数组、模拟
链接:274. H 指数 - 力扣(LeetCode)
来源:LeetCode
题目描述
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。计算并返回该研究者的 h
指数。
根据维基百科上 h 指数的定义:h
代表“高引用次数” ,一名科研人员的 h
指数 是指他(她)至少发表了 h
篇论文,并且 至少 有 h
篇论文被引用次数大于等于 h
。如果 h
有多种可能的值,h
指数 是其中最大的那个。
感觉英文也好抽象……
题目样例
提示:
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
题目思路
感觉这题难点:①什么是H指数 ②怎么求H指数
看这个题目描述也能感觉出来两个条件:①(某些)论文的数量为H ②(这些)论文的引用量均≥H——即在数组中的值大于H
那么问题就抽象为:求H,H要尽可能大。影响H的因素是citations[i]
的大小
然后是怎么求H指数:由于H指数跟数组元素的大小相关,那么数组排序之后问题就会简单很多
受定义影响,H肯定是< citations.size() 的,那么可以看一下排序后,citations[0]是否≥citations.size(),如果True的话,那么说明citations数组所有数值都比citations.size()——H的最大情况都要大。所以此时H就可以为citations.size()-0;同理,citations[1]如果≥citations.size()-1的话,也能求出H指数。
那如果是i呢?遍历到i,自然说明了i前面的数都不行。那么就要看citations[i] 和 citations.size()-i的大小关系了
因为是从左往右遍历,可能是H的值是不断变小的,所以一旦相等,势必是最大的H指数
C++代码
class Solution {
public:
int hIndex(vector<int>& citations) {
// 看评论区的模拟法
int numH =0;//h指数
sort(citations.begin(),citations.end());//论文按照升序排列;
int len = citations.size();
for(int i = 0;i < len ;i++)
{
// 如果当前数值 比 后续元素的个数 大,那么i后面所有的数都比 这个个数 大,
if(citations[i] >= len-i)
return len -i;
}
// 遍历完了没找到,可能全为0
return 0;
}
};