274. H-Index (Medium)

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 withat least3 citations each and the remaining two withno more than3 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.

Solution 1:

Time Complexity: O(nlogn)

这道题让我们求H指数,这个指数是用来衡量研究人员的学术水平的指数,定义为一个人的学术文章有n篇分别被引用了n次,那么H指数就是n。而且wiki上直接给出了算法,可以按照如下方法确定某人的H指数:1、将其发表的所有SCI论文按被引次数从高到低排序;2、从前往后查找排序后的列表,直到某篇论文的序号大于该论文被引次数。所得序号减一即为H指数。我也就没多想,直接按照上面的方法写出了代码:

int hIndex(vector<int>& citations) {
    sort(citations.begin(), citations.end(), greater<int>());
    for (int i = 0; i < citations.size(); ++i) {
        if (citations[i] <= i) return i;
    }
    return citations.size();
}

Solution 2: faster approach use extra space

Time Complexity: O(n)

int hIndex(vector<int>& citations) {
    if (citations.empty()) return 0;
    int n = citations.size();
    vector<int> hash(n+1,0); // entry i: # of papers has >= i citations

    for (int i = 0; i < n; ++i) {
        if (citations[i] >= n) ++hash[n];
        else ++hash[citations[i]];
    }

    int paper = 0;

    for (int i = n; i >= 0; --i) {
        paper += hash[i];
        if (paper >= i) return i;
    }

    return citations.size();
}

results matching ""

    No results matching ""