原創博文,轉載請注明出處!
http://github.com/wanglei5205
http://cnblogs.com/wanglei5205
# 題目
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4
# 思路
- 基於Partition的思路
時間復雜度為O(n)
- 基於紅黑樹的思路
輔助容器:定義用於遍歷向量的輔助容器--迭代器ite;定義用於存儲結果的輔助容器--多重集合res。
基本思路:首先創建一個大小為k的容器,用來存儲最小的k個數字;然后每次從輸入的n個整數中輸入一個數,如果容器中已有的數字少於k個,則直接把讀入的整數放入容器;如果容器中已有k個數字,則不能再插入新的數字而只能替換已有的數字。替換的原則:如果待插入的值m比容器中的最大值n小,則m替換n;如果待插入的值m比容器中的最大值n大,則保持不變。(在k個整數中找到最大值、刪除容器最大值、插入一個新的數字)
時間復雜度:O(n*logk)
# 代碼
1.基於partition的思路
2.基於紅黑樹的思路
1 // 使用紅黑樹實現 2 class Solution { 3 public: 4 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { 5 // 特殊輸入 6 if(input.size()<=0||k>input.size()) return vector<int>(); 7 8 // 定義降序排列的集合res,用於存儲結果 9 multiset<int, greater<int> > res; 10 11 // 定義遍歷向量的迭代器ite,遍歷向量vector 12 vector<int>::iterator cur_ite; 13 for(cur_ite = input.begin();cur_ite!=input.end();++cur_ite) 14 { 15 // 將前k個元素插入集合 16 if(res.size()<k) 17 res.insert(*cur_ite); 18 else 19 { 20 // 比較+刪除+插入 21 if(*cur_ite<*(res.begin())) 22 { 23 res.erase(res.begin()); 24 res.insert(*cur_ite); 25 } 26 } 27 } 28 return vector<int>(res.begin(),res.end()); 29 } 30 };