1. 程式人生 > >劍指Offer——最小的K個數

劍指Offer——最小的K個數

整數 return -- eap int code bre 個數 blog

題目描述:

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。


分析:

建一個K大小的大根堆,存儲最小的k個數字。

先將K個數進堆,然後調整堆為大根堆。

之後每加一個數,就和堆的根結點比較。

如果大於堆的根結點,則忽略。否則,替換根結點的值,然後調整堆。

最後,剩下的就是其中最小的K個數。


代碼:

 1 class Solution {
 2 public:
 3     vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
4 int iSize = input.size(); 5 if(k == iSize) return input; 6 vector<int> leastNumbers; 7 if(k <= 0 || k > iSize) return leastNumbers; 8 leastNumbers.push_back(0); // 使下標為0的位置為0,不使用該位置,便於訪問後面的元素 9 for(int i = 0; i < k; i++) { // 初始化一個k大小的堆
10 leastNumbers.push_back(input[i]); 11 } 12 for(int i = k / 2; i > 0; --i) { 13 HeapAdjust(leastNumbers, i, k); // 調整為大根堆 14 } 15 for(int i = k; i < iSize; i++) { 16 if(input[i] < leastNumbers[1]) { 17 leastNumbers[1
] = input[i]; 18 HeapAdjust(leastNumbers, 1, k); // 調整為大根堆 19 } 20 } 21 leastNumbers.erase(leastNumbers.begin()); // 移除第0位置的0 22 return leastNumbers; 23 } 24 25 void HeapAdjust(vector<int> &input, int s, int m) { // 調整堆 26 int rc = input[s]; 27 for(int j = (s << 1); j <= m; j <<= 1) { 28 if(j < m && input[j] < input[j + 1]) ++j; 29 if(rc > input[j]) break; 30 input[s] = input[j]; 31 s = j; 32 } 33 input[s] = rc; 34 } 35 };

劍指Offer——最小的K個數