每天一道演算法題4 查詢最小的k個元素

2021-05-23 18:01:09 字數 1307 閱讀 2381

題目:輸入 n個整數,輸出其中最小的 k個。

例如輸入 1, 2, 3, 4, 5, 6, 7和 8這 8個數字,則最小的 4個數字為 1, 2, 3和 4。

分析:這道題最簡單的思路莫過於把輸入的 n個整數排序,這樣排在最前面的 k個數就是最小的 k個數。只是這種思路的時間複雜度為 o(nlog n)。我們試著尋找更快的解決思路。

我們可以開闢乙個長度為 k的陣列。每次從輸入的 n個整數中讀入乙個數。如果陣列中已經插入的元素少於 k個,則將讀入的整數直接放到陣列中。否則長度為 k的陣列已經滿了,不能再往陣列裡插入元素,只能替換了。如果讀入的這個整數比陣列中已有 k個整數的最大值要小,則用讀入的這個整數替換這個最大值;如果讀入的整數比陣列中已有 k個整數的最大值還要大,則讀入的這個整數不可能是最小的 k個整數之一,拋棄這個整數。這種思路相當於只要排序 k個整數,因此時間複雜可以降到 o(n+nlog k)。通常情況下

k要遠小於

n,所以這種辦法要優於前面的思路。

這是我能夠想出來的最快的解決方案。不過從給面試官留下更好印象的角度出發,我們可以進一步把**寫得更漂亮一些。從上面的分析,當長度為 k的陣列已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用的資料結構中,能夠在 o(1)時間裡得到最大值的資料結構為最大堆。因此我們可以用堆( heap)來代替陣列。

另外,自己重頭開始寫乙個最大堆需要一定量的**。我們現在不需要重新去發明車輪,因為前人早就發明出來了。同樣, stl中的 set和 multiset為我們做了很好的堆的實現,我們可以拿過來用。既偷了懶,又給面試官留下熟悉 stl的好印象,何樂而不為之?

每天一道演算法題

no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...

每天一道演算法題

1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...

每天一道演算法題

1 js計算某個字串出現的次數 j ascript計算乙個字串最多重複的字元及出現次數.var str zhaochucichuzuiduodezifu var o for var i 0,length str.length i length i else console.log o 輸出的是完整的...