劍值offer之39題最小k位數(效率問題)

2021-10-05 02:29:31 字數 1051 閱讀 6568

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.演...