首先我们来看一下7月11日的H指数
附原题传送门H指数
图一
就题目本身而言其实是很简单的,只是对于文字理解上可能对于一部分人来说有困难(lc评论区都是吐槽题目文字的晦涩难懂),题目中的h指数,其实就是指作者文章有h篇文章被至少引用了h次。至少一次也就是一个向下包含的关系。我们首先看一下示例{3,0,6,1,5}数组中的值代表了没票文章被引用的次数。
通过观察我们不难发现有3篇文章的引用次数是大于3的,这句话可以等价于图一leetcode例题解释中的由于研究这有三篇论文每篇至少被引用了3次。解释中后一句的N-h篇论文每篇论文被引用次数不超过h次,也就是说{3,0,6,1,5}数组中去除大于3的N-h篇,也就是5-3=2篇,剩下的两篇{0,1}不大于h次。
接下来废话不多说直接上代码
//桶的思想和贪心
public int hIndex(int[] citations) {
//先求出桶的最大容量,也就是文章的最大引用次数
int max=0;
for (int i = 0; i < citations.length; i++) {
if(citations[i]>max) max=citations[i];
}
//桶的下标表示被引用的次数,值表示超过被引用次数的次数
int[] buckets=new int[max+1];
//循环给桶内元素赋值
for (int i = 0; i < citations.length; i++) {
//由于至少一词是一个向下包含的关系,比如说6包括{5,4,3,2,1},所以说对应的值次数也要统计
for (int j = citations[i]; j >= 0; j--) {
buckets[j]++;
}
}
//倒序查找符合题意的h值
for (int i = buckets.length-1; i >=0 ; i--) {
//有 h 篇论文分别被引用了至少 h 次
if(buckets[i]>=i) {
return i;
}
}
return -1;
}
很多人可能会在[100]、[1,3,1]等类似数据提交不通过,就是没有考虑到一个向下包含的关系。