題目:
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
分析:傳統的做法可以是o(nlog(n)),就是先排序然後從前面中取出k個值。高效的做法可以實現o(nlogk),
借助乙個容器,容量k,將陣列的讀入k個數存放在容器中,然後繼續訪問陣列後面的數,將其後每個數和容器中最大值比較,
比最大值小則剔除容器中最大值,同時將該數放入容器!這樣就可以保證遍歷整個陣列之後,容器中的數就是要找的k個較小數。
這種演算法策略非常適合大資料,並且可以不必要將整個陣列加載入記憶體!容器要支援具有排序功能,選擇c++的multiset!
#include
#include#include#include#includeusing namespace std;
vectorgetleastnumbers_solution(vectorinput, int k)
} }return vector(leastnums.begin(), leastnums.end());
}int main()
; vectorleast_k=getleastnumbers_solution(input,5);
vector::iterator it = least_k.begin();
for (; it != least_k.end(); it++)
{ cout << *it<
劍指Offer 陣列中最小的k個數
思路一 先將陣列排序完序後取k個數就完事了,基於複雜度的考慮,先使用堆排序,複雜度為o n logn 思路二 可實現維持乙個k個數的大根堆,經過維持過的大根堆,就有了較小的k個數,取出即可。具體步驟 1.可先從陣列中取k個數實現乙個大根堆,2.遍歷原陣列,將大根堆堆頂元素和原陣列中剩餘的數進行比較,...
劍指offer 最小k個數
1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...
劍指offer 最小的K個數
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...