39.最小的k位數
題目:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
解法1:基於partition函式的時間複雜度為o(n)的演算法
思路:排序
#include#includeusing namespace std;
int randominrange(int sart,int end)
int partition(int data,int length,int start,int end)
else
} for(int i=0;i
解法2:時間複雜度為o(nlogk)的演算法,適合處理海量資料
思路:1.先建立乙個大小為k的資料容器來儲存最小的k個數字,接下來每次從輸入的n個整數中讀入乙個數。
如果資料容器中已有的數字少於k個,則直接把這次讀入的整數放入容器之中;
如果容器中已有k個數字了,也就是容器已滿,此時我們不能再插入新的數字而只能替換已有的數字
2.找出這已有的k個數字中的最大值,然後拿這次待插入的整數和最大值進行比較。
如果待插入的值比當前已有的最大值小,則用這個數替換當前已有的最大值;
反之,我們可以拋棄這個數
3.當容器滿了之後:a.在k個整數中找到最大數;
b.有可能在這個容器中刪除最大數
c.插入乙個新的數字
優缺點:解法1:o(n) 需要修改輸入陣列 不適用於處理海量資料
解法2:o(nlogk) 不需要修改輸入陣列 適合處理海量資料
#include#include#includeusing namespace std;
typedef multiset> intset;
typedef multiset>::iterator setiterator;
void getleastnumbers(const vector&data,intset& leastnumbers,int k)
} }
}
劍指 39,最小的k個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 1,維護乙個小頂堆。最後依次彈出四個數字。2,基於快排的思想,排序到第k個就返回。快排 先固定乙個哨兵,然後從high和low開始比。遇到a high 哨兵的就賦值...
刷題劍指offer 最小的k個數
思路 1 快排 用partition函式,只是不是和中間的比較而是和第k個比較 2 堆排 最大堆。在最大堆中,根節點的值總是大於它的子樹中任意節點的值。於是我們每次可以在o 1 得到已有的k個數字中的最大值,但需要o logk 時間完成刪除以及插入操作。使用stl的set和multiset實現 思路...
劍指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.演...