Skip to content

274. H Index

Jacky Zhang edited this page Oct 27, 2016 · 3 revisions

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."

For example, given citations = [3, 0, 6, 1, 5], which 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, his h-index is 3.

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

Hint:

  1. An easy approach is to sort the array first.
  2. What are the possible values of h-index?
  3. A faster approach is to use extra space.

##Approach 1: O(nlogn) 解题思路为先排序,h最大为citations.length,若citations[0] >= citations.length,则h = citations.length。 否则比较citations[1] >= citations.length - 1。

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

##Approach 2: O(n) 需要采用extra space,用一个长度为n+1的数组来记录各个citation的次数。 然后倒序遍历,若总次数大于等于数组的index,则该index即为所求的h-index。

public class Solution {
    public int hIndex(int[] citations) {
        if(citations.length == 0) return 0;
        int len = citations.length;
        int[] map = new int[len+1];
        for(int c : citations) {
            if(c >= len) map[len]++;
            else map[c]++;
        }
        int n = 0;
        for(int i = len; i >= 0; i--) {
            n += map[i];
            if(n >= i) return i;
        }
        return 0;
    }
}
Clone this wiki locally