LeetCode 275. H 指数 II

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 275. H 指数 II相关的知识,希望对你有一定的参考价值。

【LetMeFly】275.H 指数 II

力扣题目链接:https://leetcode.cn/problems/h-index-ii/

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数

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

提示:如果 h 有多种可能的值,h 指数 是其中最大的那个。

请你设计并实现对数时间复杂度的算法解决此问题。

 

示例 1:

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

示例 2:

输入:citations = [1,2,100]
输出:2

 

提示:

  • n == citations.length
  • 1 <= n <= 105
  • 0 <= citations[i] <= 1000
  • citations升序排列

方法一:遍历

因为原始数组已经是排好序的了,因此越往后的论文引用次数就越高。

我们只需要从前往后遍历一遍数组,当遍历到第 i i i个元素时,如果后面 n − i n-i ni篇论文的引用次数都大于等于 n − i n-i ni,就说明 n − i n-i ni是一个h指数

因数组是升序的,所以后面 n − i n-i ni篇论文的引用次数都大于等于 n − i n-i ni 等价于 第 i i i篇论文的引用量大于等于 n − i n-i ni

第一个合法的h指数就是最大的h

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是数组中元素的个数
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
public:
    int hIndex(vector<int>& citations) 
        int n = citations.size();
        for (int i = 0; i < n; i++) 
            if (citations[i] >= n - i) 
                return n - i;
            
        
        return 0;
    
;

方法二:二分

与方法一同理,如果 n − i ≥ c i t a t i o n s [ i ] n-i\\geq citations[i] nicitations[i],那么 n − i n-i ni就是一个合法的h

并且如果 n − i n-i nih,那么 n − i − 1 n - i - 1 ni1 n − i − 2 n - i - 2 ni2 ⋯ \\cdots 都是合法的h

我们要找的就是最大的合法h

显然,二分很合适。

初始时 l l l指向合法区间的第一个元素 0 0 0 r r r指向合法区间的后一个元素 n n n n n n不合法)

l < r l < r l<r时,如果二者中值 m i d mid mid合法,就令 r = m i d r=mid r=mid,否则令 l = m i d + 1 l=mid+1 l=mid+1

最终 n − l n-l nl即为答案

  • 时间复杂度 O ( log ⁡ n ) O(\\log n) O(logn),其中 n n n是数组中元素的个数
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
public:
    int hIndex(vector<int>& citations) 
        int n = citations.size();
        int l = 0, r = n;
        while (l < r) 
            int mid = (l + r) >> 1;
            if (citations[mid] >= n - mid) 
                r = mid;
            
            else 
                l = mid + 1;
            
        
        return n - l;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126851266

以上是关于LeetCode 275. H 指数 II的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二分枚举》中等06 —— LeetCode 275. H 指数 II

275 H-Index II H指数 II

[LeetCode] 275. H-Index II H指数 II

275. H 指数 II

LeetCode 981. 基于时间的键值存储 / 274. H 指数 / 275. H 指数 II

leetcode-H-Index II-275