Leetcode - H-Index II

Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm?

[分析]
思路:二分查找。参考解法
[url]https://leetcode.com/discuss/56122/standard-binary-search[/url]
自己的实现倒也是二分查找,但因为没有理解二分查找的精髓,写得磕磕碰碰,修修补补才被Accept,代码因此也不好看,yb君一开始甚至以为是错误的。看讨论区高票解法时觉得不理解,为什么不用考虑我实现中需要的特殊情形呢,为什么return 那样写。yb君指点说,使用二分查找解题时要清楚左右边界代表的含义,参考解法中[left, right]表示尚待判断的区间,[0, left -1]表示已确认不属于目标集合的区间,而[right+1, N - 1]表示已确认属于目标集合的区间。
换句话说right表示不属于目标集合的最大下标。因此迭代结束,right + 1是目标集合的第一个元素。目标集合中元素的性质是citations[i] >= 目标集合大小。


public class Solution {
public int hIndex(int[] citations) {
if (citations == null || citations.length == 0)
return 0;
int N = citations.length;
int left = 0, right = N - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (citations[mid] == N - mid)
return citations[mid];
else if (citations[mid] > N - mid)
right = mid - 1;
else
left = mid + 1;
}
return N - (right + 1);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值