-
Notifications
You must be signed in to change notification settings - Fork 0
274. H Index
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:
- An easy approach is to sort the array first.
- What are the possible values of h-index?
- 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;
}
}