解法1:可以使用容量為K的最小堆來存儲最大的K個數,最小堆的堆頂元素就是最大K個數中最小的一個。每次新考慮一個數X,如果X比堆頂的元素Y小,則不需要改變原來的堆。如果X比Y大,那么就用X替換堆頂的元素Y,并調整新的堆成為最小堆。調整堆的時間復雜度為O(log2K)。
這樣的話,算法掃描所有的數據一次,總的時間復雜度為O(N*log2K)。
解法2:如果所有N個數都是正整數,并且它們的取值范圍不太大,都在(0,MAXN)區間的話,可以考慮申請一個空間,例如數組count[MAXN],記錄下每個整數出現的個數(count[i]表示整數i在所有整數中出現的個數)。我們只須掃描一遍就可以得到count數據,然后,從數組最后往前數出K個數就OK了。