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