k個最小的數
阿新 • • 發佈:2018-05-19
輸入 push ast IT size col tle 重復 動態
輸入n個整數,輸出k個最小的數。例如輸入4,5,1,6,2,7,3,8這8個數,則最小的4個數字是1,2,3,4。利用堆排序
(1)遍歷數組,將前k個數插入到堆中,使用multiset來實現堆
(2)繼續從輸入數組中讀入元素,作為待插入的整數,並將它與堆中的最大值進行比較,若待插入的值比這個最大值小,則用它替換最大值,否則拋棄這個數,繼續讀取下一個數.動態的維護堆中的數都是最小的,最後輸出堆即可.
multiset和set的區別是multiset允許元素重復.
如果本題變為求k個最大的數,則將最大堆變為最小堆,並且繼續從輸入數組中讀入元素,作為待插入的整數,將它與堆中的最小值進行比較,若待插入的值比這個最小值大,則用它替換最小值,否則拋棄這數,繼續讀取下一個數,動態的維護堆中的數都是最大的,最後輸出堆即可.
vector<int> GetLeastNumber(vector<int> input,int k) { vector<int> result; int lenth=input.size(); if(input.empty()||lenth<k||k<=0) { return result; } multiset<int,greater<int>> leastnumber;
multiset<int,greater<int>> ::iterator itergreater;
vector<int> ::iterator iter=input.begin(); for(;iter!=input.end();++iter) { if(leastnumber.size()<k) { leastnumber.insert(*iter); }else { itergreater=leastnumber.begin(); if(*iter<*itergreater) { leastnumber.erase(itergreater); leastnumber.insert(*iter); } } } for(iter=leastnumber.begin();iter!=leastnumber.end();++iter) { result.push_back(*iter); } return result; }
k個最小的數