一、题目

给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。

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

进阶:

  • 这是 H 指数 的延伸题目,本题中的 citations 数组是保证有序的。
  • 你可以优化你的算法到对数时间复杂度吗?

点击查看原题
难度级别: 中等

二、思路

1)二分法

先要理清楚一次遍历的解法,是通过文章的数量和引用值做比较取最小;当引用比文章数量小,就没必要继续往更低引用的文章方向遍历了。
使用二分可以快速找到 文章数量 和 引用值 较小值最大的那个位置,假设现访问数组下标i,引用值为citations[i],文章数量为citations.length - i,此处的引用值hmin(citations[i], citations.length - i),有以下情况:

1、当h<citations[i]时,改变右指针 2、当h==citations[i]时,改变左指针

三、代码

1)二分法

  1. class Solution {
  2. public int hIndex(int[] citations) {
  3. int ans = 0;
  4. int left = 0, right = citations.length;
  5. while (left < right) {
  6. int mid = (left + right)/2;
  7. int tempH = Math.min(citations[mid], citations.length - mid);
  8. ans = Math.max(tempH, ans);
  9. if (tempH < citations[mid]) {
  10. right = mid;
  11. } else {
  12. left = mid + 1;
  13. }
  14. }
  15. return ans;
  16. }
  17. }

时间复杂度为O(logn),空间复杂度为O(1)