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


原創博文,轉載請注明出處!

http://github.com/wanglei5205

http://cnblogs.com/wanglei5205

# 題目

      輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4

# 思路

image

  • 基於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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM