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$个元素时,如果后面$n-i$篇论文的引用次数都大于等于$n-i$,就说明$n-i$是一个h指数

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

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

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

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
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\geq citations[i]$,那么$n-i$就是一个合法的h

并且如果$n-i$是h,那么$n - i - 1$、$n - i - 2$、$\cdots$都是合法的h

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

显然,二分很合适。

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

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

最终$n-l$即为答案

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

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


275.H 指数 II
https://blog.letmefly.xyz/2022/09/14/LeetCode 0275.H指数II/
作者
Tisfy
发布于
2022年9月14日
许可协议