(Java) LeetCode 274. H-Index —— H指數

來源:互聯網
上載者:User

標籤:tar   with   blank   The   情況   least   ons   value   span   

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.

 

解法一,O(nlogn):

上來先排序,這麼做的理由顯而易見,因為排過序之後就會建立引用數和文章數的關係。比如例子中,排過序之後就變成了{0, 1, 3, 5, 6}。如果倒序遍曆排序過的數組就會獲得如下資訊:第五篇文章被引用6次,證明有五篇文章引用次數小於或等於它,換句話說就是有一篇文章引用次數大於或等於5。而H指數要求有h篇文章至少被引用h次,那麼證明這個引用次數太大了,所以繼續向引用次數較小的方向遍曆。當遍曆到第四篇文章的時候,被引用次數是5次,證明有兩篇文章的引用次數大於等於5。再繼續,第三篇被引用三次,那麼就是有三篇文章引用次數大於等於3次。而再繼續向下遍曆的時候,知道有四篇文章的引用數大於等於1,已經不滿足條件了。所以其實對於例子來說,H指數已經求出來了,就是3,即結果出現在介於滿足和不滿足定義之間的那次遍曆。再想一下特殊的情況,假如輸入是{3, 3, 3, 5, 6}呢?遍曆到第三篇的時候得知至少有三篇文章引用次數大於等於3,而到了第二篇的時候就是4篇文章引用次數大於等於3,H指數就比定義大了。所以當文章數第一次達到臨界值的時候,H指數不應該再增加了。體現在代碼上就是嚴格的大於符號,而不是大於等於符號。如果想不明白,可以想一個{0, 0, 0}或{1, 1, 1}的例子。詳見下文代碼。

 

解法二,O(n):

解法一排序的目的就是為了建立引用數和文章數的關係。有沒有辦法不排序,或者至少不通過比較排序而建立這個關係呢?因為比較排序的時間複雜度至少也是線性對數層級,非比較排序是可以最佳化到線性時間複雜度的。這個時候就想起了計數排序。通過計數,直接統計每個引用次數下面有多少文章。而再通過掃描累加,就會知道大於等於某一個引用次數的文章是多少。當找到第一個文章數大於等於引用數的計數點,即找到了所求。這裡要注意如果一篇文章的引用數大於等於總文章數,那麼它對H指數的貢獻最多是n次,即文章總數。因為H指數是不可能大於總文章數的。所以在計數的時候把這類文章單獨放到計數數組最後面,再加上特別的判斷即可。詳見代碼。

 

解法一(Java)

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

 

解法二(Java)

class Solution {    public int hIndex(int[] citations) {        int n = citations.length;        int[] count = new int[n + 1];        for (int i = 0; i < n; i++) {            if (citations[i] >= n) count[n]++; //統計引用數比總文章數還多的文章數目            else count[citations[i]]++; //統計每個引用次數下有多少篇文章        }        if (count[n] >= n) return n; //如果每篇文章的引用數都比文章數多,那H指數最多也只能是文章數n        for (int i = n - 1; i >= 0; i--) {            count[i] += count[i + 1]; //不要忘了這裡的i一直是引用次數,所以這一步在統計大於等於i的文章總數,即逐個累加大於等於i的計數            if (count[i] >= i) return i; //一旦找到滿足條件的引用次數,即返回        }        return 0;    }}

 

(Java) LeetCode 274. H-Index —— H指數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.