一、题目
给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。
h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)"
示例:
输入: citations = [0,1,3,5,6]
输出: 3
解释: 给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。
由于研究者有 3 篇论文每篇至少被引用了 3 次,其余两篇论文每篇被引用不多于 3 次,所以她的 h 指数是 3。
说明:
如果 h 有多有种可能的值 ,h 指数是其中最大的那个。
进阶:
- 这是 H 指数 的延伸题目,本题中的 citations 数组是保证有序的。
- 你可以优化你的算法到对数时间复杂度吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/h-index-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 二分查找
(1)思路
本题中论文已按引用次数升序排列,则对最终的指数 h,[0, n - h) 区间内的论文引用次数均小于 h,[n - h, n) 区间内的论文引用次数均不小于 h。
根据这一特点,可结合二分法,在 O(logN) 时间复杂度内完成查找求解。
(2)代码
class Solution {
public int hIndex(int[] citations) {
int n = citations.length, l = 0, r = n;//论文总数,二分法左边界、右边界
while (l < r) {//二分查找,直至左右边界重合,即最大的h指数为n-l
int mid = (l + r) >> 1;
if (citations[mid] < n - mid)//少于n-mid篇论文引用次数不小于n-mid,移动左边界
l = mid + 1;
else//至少有n-mid篇论文引用次数不小于n-mid,移动右边界
r = mid;
}
return n - l;//返回h指数
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :45.3 MB,在所有 Java 提交中击败了 49.59% 的用户。
三、其他
暂无。