题目地址:
https://leetcode.com/problems/h-index-ii/
题意是,给定一个单调增非负数组,找出满足这样性质的数 :有多于等于 个数是大于等于 的。返回满足这样条件的最大的那个 。
思路是二分。首先考虑解的范围。显然 是满足条件的,并且 最大不超过数组长度 ,否则的话,要存在多于 个大于等于 的数,超出数组长度了,是不可能的。接下来 有这样的性质:如果 满足条件,那么 也满足条件。这为二分创造了条件。注意到 满足条件,等价于数组倒数第 个数是大于等于 的,这就是判断条件。代码如下:
public class Solution {
public int hIndex(int[] citations) {
int l = 0, r = citations.length;
while (l < r) {
int mid = l + ((r - l + 1) >> 1);
// 判断倒数第mid个数是不是大于等于mid
if (citations[citations.length - mid] >= mid) {
// 如果是,那么mid满足条件,
// 由于要找最大的满足条件的数,所以向右搜索
l = mid;
} else {
// 否则mid不满足条件,需要向左搜索。
r = mid - 1;
}
}
return l;
}
}
时间复杂度 。