[劍指offer] 最小的K個數,C++實現
阿新 • • 發佈:2018-04-13
urn bubuko 存儲 best 9.png clas master 代碼 wan
原創博文,轉載請註明出處!
github地址
# 題目
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4
# 思路
1.基於Partition的思路
時間復雜度為O(n)
2.基於紅黑樹的思路
首先創建一個大小為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 // 建立用於存儲結果的多重集合及多重集合的最大元素的叠代器9 multiset<int, greater<int> > res; 10 multiset<int, greater<int> >::iterator res_best; 11 12 // 遍歷輸入 13 vector<int>::iterator input_ite = input.begin(); // 向量叠代器 14 for(;input_ite!=input.end();input_ite++) 15 { 16 // 將前k個元素插入集合17 if(res.size()<k) 18 res.insert(*input_ite); 19 else 20 { 21 // 多重集合中最大元素的叠代器 22 res_best = res.begin(); 23 // 比較+刪除+插入 24 if(*input_ite<*(res.begin())) 25 { 26 res.erase(res_best); 27 res.insert(*input_ite); 28 } 29 } 30 } 31 return vector<int>(res.begin(),res.end()); 32 } 33 };
[劍指offer] 最小的K個數,C++實現