0274. H-Index (M)

H-Index (M)

题目

Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.

According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than h citations each."

Example:

Input: citations = [3,0,6,1,5]
Output: 3 
Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had 
             received 3, 0, 6, 1, 5 citations respectively. 
             Since the researcher has 3 papers with at least 3 citations each and the remaining 
             two with no more than 3 citations each, her h-index is 3.

Note: If there are several possible values for h, the maximum one is taken as the h-index.


题意

设一个研究者共有n篇论文,如果其中有h篇,这h篇中每一篇都被引用过至少h次,而剩余的n-h篇中每一篇被引用的次数都不超过h,则称h为这个研究者的h指数。求一个研究者h指数的最大值。

思路

h的范围很明显是 0-n,所以只要从n往回找到第一个满足的h,就是答案。因此可以这样处理:先将数组按升序排序,从头遍历数组,对于每一个i,length - i即为从i到最后一个元素的长度len,如果citations[i] >= len,说明后面len个论文的引用次数都大于等于len,且前面所有i个论文的引用次数必不大于len (证明如下),因此len就是要找的h指数。

证明:假设在i处找到了满足的len,那么有 citations[i] > len (等于的情况无需证明),如果 citations[i - 1] > len,一定有 citations[i - 1] >= len + 1 (因为是整数),那么说明在i - 1处就应该已经找到了满足的len值,但实际情况并不是,所以 citation[i - 1] <= len,证明前i个论文的引用次数一定都不超过len,满足题目要求。

也可以不用排序:记citations.length为n,建一个长度为n + 1的辅助数组aux,aux[i]表示引用次数等于i的论文篇数,aux[n]表示引用次数大于等于n的论文篇数。遍历citations,如果citations[i] > n,则aux[n]++,否则aux[citations[i]]++。再从后向前遍历aux数组,统计当前和是否大于等于当前下标index,是的话说明index就是所要求的的h指数。


代码实现

Java

排序

class Solution {
    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        for (int i = 0; i < citations.length; i++) {
            if (citations[i] >= citations.length - i) {
                return citations.length - i;
            }
        }
        return 0;
    }
}

不排序

class Solution {
    public int hIndex(int[] citations) {
        int len = citations.length;
        int[] aux = new int[len + 1];
        for (int i = 0; i < len; i++) {
            if (citations[i] > len) {
                aux[len]++;
            } else {
                aux[citations[i]]++;
            }
        }
        int sum = 0;
        for (int i = aux.length - 1; i >= 0; i--) {
            sum += aux[i];
            if (sum >= i) {
                return i;
            }
        }
        return 0;
    }
}

JavaScript

排序

/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function (citations) {
  citations.sort((a, b) => a - b)
  for (let i in citations) {
    if (citations[i] >= citations.length - i) {
      return citations.length - i
    }
  }
  return 0
}

不排序

/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function (citations) {
  let aux = new Array(citations.length + 1).fill(0)
  for (let x of citations) {
    if (x > citations.length) {
      aux[citations.length]++
    } else {
      aux[x]++
    }
  }
  let sum = 0
  for (let i = aux.length - 1; i >= 0; i--) {
    sum += aux[i]
    if (sum >= i) {
      return i
    }
  }
  return 0
}
posted @ 2020-06-18 06:58  墨云黑  阅读(213)  评论(0编辑  收藏  举报