问题:
易错点:
感觉这个题,并不是很难,而是 一开始真的很难get题意,尝试了几次错误之后才明白过来。。
这个h,并不是说某一篇论文的引用次数是这个数字才算满足条件
例如:citations=[100] 的时候,并不是没有满足条件的数字,,,这个情况下答案是1,因为至少有1篇论文至少被引用了1次(1<100),满足题意。
思路:
为了方便理解,我做了一个表格:针对例子:
citations=[0,1,2,5,6]
如图,
第一行的1-5,记为h,分别他的1-5篇论文
第一列,是每篇论文的引用次数citations[i] (倒着写是因为,需要从后往前遍历,找到符合条件的值)
1 | 2 | 3 | 4 | 5 | |
6 | 6>1(继续) | ||||
5 | 5>2(继续) | ||||
3 | 3=3(正解) | ||||
1 | 1<4(过了) | ||||
0 |
从数组的末尾向前遍历,声明一个变量h 来记录已经遍历了多少篇文章,也就是第一行的1~5
所以,我们的问题就变成了看对角线上的方格,
如果citations[i] > h 说明还有机会,继续遍历;
如果citations[i] = h 说明这个是最优答案,不用再走了,直接返回吧
如果citations[i] < h 说明遍历多了,返回h-1才是最优解
同理,再看几个例子:
citations=[0]
1 | |
0 | 0<1(过了) |
如表格,当h=1的时候,就直接不满足条件了,那就返回h-1 即0;
citations=[100]
1 | |
100 | 100>1(继续) |
这个时候,发现,h=1 的时候,还可以继续,但是已经是最后一篇了怎么办?
因为大于语句块里写的是h++,所以等于说下一步,跳出for循环的时候,h值比正解打, 在for循坏外加一个return h-1,即可
代码:
class Solution {
public int hIndex(int[] citations) {
int h = 0;//先声明h,用来表示论文数
//如果论文数是空的,那就没必要了麻烦了,直接返回0;
if(citations.length == 0) {
return 0;
}else {
h = 1;//这里将h换为1 ,因为只要开始看,那就是第一篇论文
for(int i = citations.length-1;i>=0;i--) {
if(citations[i]>h) {
h++;//被引用次数大,所以继续
}else if(citations[i]==h) {
return h;//相同,证明是最优解,直接返回结果
}else {
return h-1;//被引用的次数小,所以返回h-1
}
}
return h-1;
}
}
}
做完之后,看大家的答案,发现大多是二分法,但是 emmm,我应该没做错吧。