H-Index

Problem

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.

Solution

Brute Force Solution with Sorting

public class Solution {
    public int hIndex(int[] citations) {
        if (citations == null || citations.length == 0) return 0;
        Arrays.sort(citations);
        int len = citations.length;
        for (int h = len; h >= 0; h--) {
            int hPapers = 0, index = len - 1;
            while (index >= 0) {
                if (citations[index] >= h) hPapers++;
                else break;
                index--;
            }
            if (hPapers >= h) return h; //No need to check left papers with citations less than h, cause it's obvious
        }
        return 0;
    }
}

O(n) Solution using extra Array

public class Solution {
    public int hIndex(int[] citations) {
        if (citations == null || citations.length == 0) return 0;
        int len = citations.length;
        int[] counts = new int[len + 1]; //hIndex can be len at most
        for (int cite : citations) {
            if (cite < len) counts[cite]++;
            else counts[len]++;
        }
        int hPapers = 0;
        for (int h = len; h >= 0; h--) {
            hPapers += counts[h];
            if (hPapers >= h) return h;
        }
        return 0;
    }
}

Analysis

In the first solution, we sort the given citations and then we loop through every possible hIndex
Since hIndex can be len at most, we init hIndex = len then get hPapers using another while loop
For the while loop, we have a index from last to first to get counts of paper with hIndex citations
We return hIndex if our hPapers has counts at least hIndex

In the second solution, we have an array counts, counts[i] means the # of papers with i citations
For each citation from citations, we update counts[cite] and for cite > len, we add it to counts[len]
Then we count hPapers from highest hIndex = len
If we have at least hIndex numbers of hPapers, we return current hIndex
We don't need to check left papers because we starts from higher numbers of citations paper to lower numbers of citations paper

results matching ""

    No results matching ""