LeetCode,第275题H指数Ⅱ,Java

问题:

易错点:

感觉这个题,并不是很难,而是 一开始真的很难get题意,尝试了几次错误之后才明白过来。。

 这个h,并不是说某一篇论文的引用次数是这个数字才算满足条件

        例如:citations=[100] 的时候,并不是没有满足条件的数字,,,这个情况下答案是1,因为至少有1篇论文至少被引用了1次(1<100),满足题意。

思路:

为了方便理解,我做了一个表格:针对例子:

citations=[0,1,2,5,6]

如图,

第一行的1-5,记为h,分别他的1-5篇论文

第一列,是每篇论文的引用次数citations[i] (倒着写是因为,需要从后往前遍历,找到符合条件的值)

12345
66>1(继续)
55>2(继续)
33=3(正解)
11<4(过了)
0

 从数组的末尾向前遍历,声明一个变量h 来记录已经遍历了多少篇文章,也就是第一行的1~5

所以,我们的问题就变成了看对角线上的方格,

如果citations[i] > h  说明还有机会,继续遍历;

如果citations[i] = h  说明这个是最优答案,不用再走了,直接返回吧 

如果citations[i] < h  说明遍历多了,返回h-1才是最优解

同理,再看几个例子:

citations=[0]

1
00<1(过了)

 如表格,当h=1的时候,就直接不满足条件了,那就返回h-1  即0;

citations=[100]

1
100100>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,我应该没做错吧。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值