摘要:排序法復雜度時間空間思路先將數(shù)組排序,我們就可以知道對于某個引用數(shù),有多少文獻的引用數(shù)大于這個數(shù)。代碼排序得到當前的指數(shù)數(shù)組映射法復雜度時間空間思路也可以不對數(shù)組排序,我們額外使用一個大小為的數(shù)組。
H-Index I
排序法 復雜度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.
時間 O(NlogN) 空間 O(1)
思路先將數(shù)組排序,我們就可以知道對于某個引用數(shù),有多少文獻的引用數(shù)大于這個數(shù)。對于引用數(shù)citations[i],大于該引用數(shù)文獻的數(shù)量是citations.length - i,而當前的H-Index則是Math.min(citations[i], citations.length - i),我們將這個當前的H指數(shù)和全局最大的H指數(shù)來比較,得到最大H指數(shù)。
代碼public class Solution { public int hIndex(int[] citations) { // 排序 Arrays.sort(citations); int h = 0; for(int i = 0; i < citations.length; i++){ // 得到當前的H指數(shù) int currH = Math.min(citations[i], citations.length - i); if(currH > h){ h = currH; } } return h; } }數(shù)組映射法 復雜度
時間 O(N) 空間 O(N)
思路也可以不對數(shù)組排序,我們額外使用一個大小為N+1的數(shù)組stats。stats[i]表示有多少文章被引用了i次,這里如果一篇文章引用大于N次,我們就將其當為N次,因為H指數(shù)不會超過文章的總數(shù)。為了構(gòu)建這個數(shù)組,我們需要先將整個文獻引用數(shù)組遍歷一遍,對相應的格子加一。統(tǒng)計完后,我們從N向1開始遍歷這個統(tǒng)計數(shù)組。如果遍歷到某一個引用次數(shù)時,大于或等于該引用次數(shù)的文章數(shù)量,大于引用次數(shù)本身時,我們可以認為這是H指數(shù)。之所以不用再向下找,因為我們要取最大的H指數(shù)。那如何求大于或等于某個引用次數(shù)的文章數(shù)量呢?我們可以用一個變量,從高引用次的文章數(shù)累加下來。因為我們知道,如果有x篇文章的引用大于等于3次,那引用大于等于2次的文章數(shù)量一定是x加上引用次數(shù)等于2次的文章數(shù)量。
代碼public class Solution { public int hIndex(int[] citations) { int[] stats = new int[citations.length + 1]; int n = citations.length; // 統(tǒng)計各個引用次數(shù)對應多少篇文章 for(int i = 0; i < n; i++){ stats[citations[i] <= n ? citations[i] : n] += 1; } int sum = 0; // 找出最大的H指數(shù) for(int i = n; i > 0; i--){ // 引用大于等于i次的文章數(shù)量,等于引用大于等于i+1次的文章數(shù)量,加上引用等于i次的文章數(shù)量 sum += stats[i]; // 如果引用大于等于i次的文章數(shù)量,大于引用次數(shù)i,說明是H指數(shù) if(sum >= i){ return i; } } return 0; } }H-Index II
二分搜索法 復雜度Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm?
時間 O(logN) 空間 O(1)
思路在升序的引用數(shù)數(shù)組中,假設(shè)數(shù)組長為N,下標為i,則N - i就是引用次數(shù)大于等于下標為i的文獻所對應的引用次數(shù)的文章數(shù)。如果該位置的引用數(shù)小于文章數(shù),則說明則是有效的H指數(shù),如果一個數(shù)是H指數(shù),那最大的H指數(shù)一定在它的后面(因為是升序的)。根據(jù)這點就可已進行二分搜索了。這里min = mid + 1的條件是citations[mid] < n - mid,確保退出循環(huán)時min肯定是指向一個有效的H指數(shù)。
代碼public class Solution { public int hIndex(int[] citations) { int n = citations.length; if(n == 0) return 0; int min = 0, max = citations.length - 1; while(min <= max){ int mid = (min + max) / 2; // 如果該點是有效的H指數(shù),則最大H指數(shù)一定在右邊 if(citations[mid] < n - mid){ min = mid + 1; // 否則最大H指數(shù)在左邊 } else { max = mid - 1; } } // n - min是min點的H指數(shù) return n - min; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64578.html
H-Index 題目鏈接:https://leetcode.com/problems... sort: public class Solution { public int hIndex(int[] citations) { if(citations == null || citations.length == 0) return 0; // sort ...
摘要:題目解答滿足這個的最大值不會超過數(shù)組的因為如果超過了,就不可能有這么多的數(shù)。所以就是把所有可能的個至少有個的記下來,然后找出最大的。因為是從后向前掃的,所以當前的就是滿足條件的最大數(shù)。 題目:Given an array of citations (each citation is a non-negative integer) of a researcher, write a fun...
摘要:題目要求此處為題目鏈接即用自己的代碼實現(xiàn)指數(shù)運算。指數(shù)為負數(shù)即求其倒數(shù)。思路一二分法計算這題的思路我之前的一篇博客思路基本相同。所以在能轉(zhuǎn)換為循環(huán)的情況下還是最好使用循環(huán)來解決。 題目要求 此處為題目鏈接即用自己的代碼實現(xiàn)指數(shù)運算。指數(shù)運算一般有兩種情況,即指數(shù)為整數(shù)和指數(shù)為負數(shù)的情況。指數(shù)為負數(shù)即求其倒數(shù)。 思路一:二分法計算 這題的思路我之前的一篇博客思路基本相同。有興趣的可以直接...
前端LeetCode刷題 下面是已刷的題目的目錄。GitHub:https://github.com/cunzaizhuy...每日打卡更新中,歡迎關(guān)注。 數(shù)組類 26 刪除排序數(shù)組中的重復項 27 移除元素 35 搜索插入位置 66 加1 80 medium 刪除排序數(shù)組中的重復項2 88 合并兩個有序數(shù)組 167 兩數(shù)之和II - 輸入有序數(shù)組 118 楊輝三角 169 easy 求眾數(shù) 1...
閱讀 4012·2021-11-18 13:22
閱讀 1831·2021-11-17 09:33
閱讀 2886·2021-09-26 09:46
閱讀 1220·2021-08-21 14:11
閱讀 2896·2019-08-30 15:53
閱讀 2717·2019-08-30 15:52
閱讀 1915·2019-08-30 10:52
閱讀 1528·2019-08-29 15:30