劍指Offer——最小的K個數
阿新 • • 發佈:2017-10-31
整數 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個數