【leetcode】275. H 指数 II(h-index-ii)(二分)[中等]

2023-05-16

链接

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

耗时

解题:5 h 5 min
题解:9 min

题意

给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。

h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)"

进阶:

  • 这是 H 指数 的延伸题目,本题中的 citations 数组是保证有序的。
  • 你可以优化你的算法到对数时间复杂度吗?

思路

是 【leetcode】274. H 指数(h-index)(二分)[中等] 的进阶,不同的是:

  1. 多给了有序的条件
  2. 要求对数时间复杂度完成

二分答案。h 指数最大是论文数量即数组长度,最小是 0。在 0~n 之间二分,每次检查数组中大于等于当前 h 的元素数量是否大于等于 h,因为数组已经按升序排列,所以不必 O(n) 的判断只需检查倒数第 h 个论文引用数是否大于 h 即可(因为升序,如果倒数第h个元素大于等于h,那么其后面的元素都大于等于h,就存在有 h 篇论文至少被引用 h 次)。这样即能找到最大的 h指数。

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

AC代码

class Solution {
private:
    vector<int> citations;
    int n;
public:
    bool check(int h) {
        if(h == 0) return true; 
        return citations[n-h] >= h;
    }
    
    int hIndex(vector<int>& citations) {
        this->citations = citations;
        n = citations.size();
        int s = 0, t = n;
        while(s <= t) {
            int m = (s+t)>>1;
            if(check(m)) s = m+1;
            else t = m-1;
        }
        return s-1;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】275. H 指数 II(h-index-ii)(二分)[中等] 的相关文章

随机推荐