劍指offer 面試題40 最小的K個數

2021-09-11 04:15:45 字數 968 閱讀 3527

面試題–【劍指offer】 題目解答

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

坑點:輸入n個整數,找出其中最小的k個數

在這裡我們很容易在主觀上預設n>k,從而在討論k的不合法性時,忘記了k>n的情況,實際上當 k>n 或者 k<=0 那麼都將返回空!!!

下面我們從兩種解法來討論本題的做法

第一種,時間複雜o(n),對於乙個排序的陣列,我們只要輸出他的前k個數字即可符合題意。

所以我們第一種做法是對陣列進行排序,在這裡可以有多種排序的方法,就不過多贅述了,不同的放法對應的效率不同。這裡為了方便,我們使用stl裡的排序函式進行排序。

class solution 

return result;}}

;

第二種,我們用最大堆來實現,主要考慮在資料流較大時候的效率和可操作性。

思想是,我們先把陣列中的前k個數儲存起來,接下來只要依次比較後邊的數,如果後面的數比k個數中最大的還大那麼不予考慮,如果比最大的小那麼就進行替換,所以我們還要知道k個書中最大的是那個,根據這個需要,我們需用從大到小排列順序的multieset作為結構。k個數中的最大值就是multiset的首元素!

簡化為為乙個關係就是:插入—比較—替換(或不變)

class solution 

else}}

for(itergreater = leastnumbers.

begin()

;itergreater!=leastnumbers.

end();

++itergreater)

return result;}}

;

劍指offer面試題40 最小的k個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法一 快速排序,o n 修改原陣列 要注意和原始快排的區別,當不滿足start end時,需要返回end,而不是直接返回 方法二 堆排序 k個元素的最大堆 o nlogk 適合海...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...