一、题目
给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。
h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)”
进阶:
- 这是 H 指数 的延伸题目,本题中的
citations
数组是保证有序的。 - 你可以优化你的算法到对数时间复杂度吗?
点击查看原题
难度级别: 中等
二、思路
1)二分法
先要理清楚一次遍历的解法,是通过文章的数量和引用值做比较取最小;当引用比文章数量小,就没必要继续往更低引用的文章方向遍历了。
使用二分可以快速找到 文章数量 和 引用值 较小值最大的那个位置,假设现访问数组下标i
,引用值为citations[i]
,文章数量为citations.length - i
,此处的引用值h
为min(citations[i], citations.length - i)
,有以下情况:
1、当h<citations[i]时,改变右指针 2、当h==citations[i]时,改变左指针
三、代码
1)二分法
class Solution {
public int hIndex(int[] citations) {
int ans = 0;
int left = 0, right = citations.length;
while (left < right) {
int mid = (left + right)/2;
int tempH = Math.min(citations[mid], citations.length - mid);
ans = Math.max(tempH, ans);
if (tempH < citations[mid]) {
right = mid;
} else {
left = mid + 1;
}
}
return ans;
}
}
时间复杂度为O(logn)
,空间复杂度为O(1)