【Leetcode】275. H-Index II

题目地址:

https://leetcode.com/problems/h-index-ii/

题意是,给定一个单调增非负数组,找出满足这样性质的数 h h :有多于等于 h h 个数是大于等于 h h 的。返回满足这样条件的最大的那个 h h

思路是二分。首先考虑解的范围。显然 0 0 是满足条件的,并且 h h 最大不超过数组长度 n n ,否则的话,要存在多于 n + 1 n+1 个大于等于 n + 1 n+1 的数,超出数组长度了,是不可能的。接下来 h h 有这样的性质:如果 h h 满足条件,那么 0 , . . . , h 1 0,...,h-1 也满足条件。这为二分创造了条件。注意到 h h 满足条件,等价于数组倒数第 h h 个数是大于等于 h h 的,这就是判断条件。代码如下:

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;
    }
}

时间复杂度 O ( log n ) O(\log n)

发布了86 篇原创文章 · 获赞 0 · 访问量 1202

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/104022196