题意:
一个数组,代表一个学者的所有论文。每个数值代表该篇论文的引用次数。找到一个最大的数值h,使该学者有h篇论文至少都被引用h次,其它的所有论文都至多被引用h次。。
分析:
看作是一个横纵坐标的直方图,只需要两重循环,从上向下(因为要找最大的)遍历搜索y轴,内循环遍历x轴判断。
public class Solution {
public int hIndex(int[] citations) {
int h = citations.length;
while(h>=1){
int count = 0;
for(int c: citations){
if(h <= c)
count++;
}
if(count >= h){
return h;
}
h--;
}
return h;
}
}
但是我们可不可以继续优化呢?
这个时候我们要优化,必然要尝试用空间换时间了。
我们的循环能不能去掉呢?
先想清楚我们的循环在干什么?
外循环:遍历论文值,寻找最大的可能论文值。
内循环:对于一个论文值,遍历所有的论文,看有多少论文的值大于等于这个值。
我们看看有没有信息,不用去循环遍历查找,而可以存储起来的,显然最可能的信息是:有多少论文的值大于等于这个值。这个信息
所以我们可以存储这个信息。比如5篇论文:引用数为1,2,3,4,5(大于5)的分别是多少。
public class Solution {
public int hIndex(int[] citations) {
int[] message = new int[citations.length+1];
int sum = 0;
for(int i=0; i<citations.length; i++){
if(citations[i] < citations.length){
message[citations[i]]++;
}else{
message[citations.length]++;
}
}
int h=citations.length;
for(; h>0; h--){
sum += message[h];
if(sum >= h){
return h;
}
}
return h;
}
}