链接
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)(二分)[中等] 的进阶,不同的是:
- 多给了有序的条件
- 要求对数时间复杂度完成
二分答案。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;
}
};