Skip to content

[leetcode]274.H指数 #39

@MagicalBridge

Description

@MagicalBridge

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

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

例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。

示例:

输入:citations = [3,0,6,1,5]
输出:3 
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
     由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/h-index
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

提示:如果 h 有多种可能的值,h 指数是其中最大的那个。

方法一:
我们想象一个直方图,其中x轴表示文章,y轴表示每篇文章的引用次数。如果将这些文章按照引用次数降序排列并在直方图上展示,那么直方图上的最大正方形的边长h就是就是我们所要求的h。

算法
首先我们将引用次数进行降序排列,在排序数组citations中,如果citation[i] > i, 那么 0 到 i 篇论文都有至少 i+1 次引用。因此我们只要找到最大的i满足citation[i] > i,那么h指数就是 i+1。

i 0 1 2 3 4 5 6
引用次数 10 9 5 3 3 2 1
citations[i] > i true true true false false false false

其中最大满足 citations[i]>i 的 i 值为 2。

因此 h = i + 1 = 3 h = i+1=3。

找到最大的i的方法很多,可以对数组进行线性扫描,也可以使用二分查找。由于排序的时间复杂度已经为 $O(nlogn)$,因此无论是线性扫描$O(n)$,还是使用二分查找 $O(logn)$,都不会改变算法的总复杂度。

/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function (citations) {
  // 将给定的数组进行升序排列
  citations.sort((a, b) => {
    return a - b;
  })
  // 因为上面使用的是升序排列,所以需要倒序扫描
  let i = 0;
  while(i < citations.length && citations[citations.length - 1 - i] > i) {
    i++
  }
  return i;
};

复杂度分析

  • 时间复杂度:O(n\log n)O(nlogn),即为排序的时间复杂度。
  • 空间复杂度:O(1)O(1)。大部分语言的内置 sort 函数使用堆排序,它只需要 O(1)O(1) 的额外空间。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions