1. 程式人生 > >[劍指offer] 最小的K個數,C++實現

[劍指offer] 最小的K個數,C++實現

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++實現