Leetcode.274 H 指数

题目链接

Leetcode.274 H 指数 mid

题目描述

给你一个整数数组 c i t a t i o n s citations citations ,其中 c i t a t i o n s [ i ] citations[i] citations[i] 表示研究者的第 i i i 篇论文被引用的次数。计算并返回该研究者的 h h h 指数

根据维基百科上 h h h 指数的定义: h h h 代表“高引用次数” ,一名科研人员的 h h h 指数 是指他(她)至少发表了 h h h 篇论文,并且每篇论文 至少 被引用 h h h 次。如果 h h h 有多种可能的值, h h h 指数 是其中最大的那个。

示例 1:

输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。

示例 2:

输入:citations = [1,3,1]
输出:1

提示:
  • n = c i t a t i o n s . l e n g t h n = citations.length n=citations.length
  • 1 ≤ n ≤ 5000 1 \leq n \leq 5000 1n5000
  • 0 ≤ c i t a t i o n s [ i ] ≤ 1000 0 \leq citations[i] \leq 1000 0citations[i]1000

解法:二分

我们定义 c h e c k ( k ) check(k) check(k),表示 c i t a t i o n s citations citations 至少存在 k k k 篇论文被引用超过 k k k 次,即 c i t a t i o n s citations citations 是否满足 k k k 指数

我们采用 二分 解决,初始时 :

l = 0 , r = n l = 0 , r = n l=0,r=n

m i d = ( l + r ) / 2 mid = (l + r) / 2 mid=(l+r)/2

如果 c h e c k ( m i d ) check(mid) check(mid) 成立,即满足 m i d mid mid 指数,说明 m i d mid mid 可能就是答案,即 l = m i d l = mid l=mid

否则,不满足 m i d mid mid 指数,说明 m i d mid mid 太大了,故 r = m i d − 1 r = mid - 1 r=mid1

时间复杂度: O ( n × l o g n ) O(n \times logn) O(n×logn)

C++代码:

class Solution {
public:
    int hIndex(vector<int>& citations) {
        int n = citations.size();
        int l = 0 , r = n;

        auto check = [&](int k) ->int{
            int cnt = 0;
            for(auto x:citations){
                if(x >= k) cnt++;
            }
            return cnt >= k;
        };

        while(l < r){
            int mid = (l + r + 1) >> 1;
            if(check(mid)) l = mid;
            else r = mid - 1;
        }

        return l;
    }
};

你可能感兴趣的:(Leetcode,算法,二分)