面試題40 最小的k個數!

2021-09-22 21:08:33 字數 1016 閱讀 4517

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

方法一:堆排序

class solution 

} }

public:

vectorgetleastnumbers_solution(vectorinput, int k)

return result;

}};

方法二:利用快速排序中的獲取分割(中軸)點位置函式getpartitiion。基於陣列的第k個數字來調整,使得比第k個數字小的所有數字都位於陣列的左邊,比第k個數字大的所有數字都位於陣列的右邊。調整之後,位於陣列左邊的k個數字就是最小的k個數字(這k個數字不一定是排序的)。o(n)

class solution 

int getpartition(vector&input,int start,int end)

else

}for(int i=0;i這種思路雖時間複雜度不錯,但會修改輸入陣列,不適用於海量資料,且一般也不易想到。更容易想到的是利用堆排序。

方法三:利用multiset實現堆排序

利用堆排序,o(n logk),適合處理海量資料

(1) 遍歷輸入陣列,將前k個數插入到推中;(利用multiset來做為堆的實現)

(2) 繼續從輸入陣列中讀入元素做為待插入整數,並將它與堆中最大值比較:

如果待插入的值比當前已有的最大值小,則用這個數替換當前已有的最大值;如果待插入的值比當前已有的最大值還大,則拋棄這個數,繼續讀下乙個數。這樣動態維護堆中這k個數,以保證它只儲存輸入陣列中的前k個最小的數,最後輸出堆即可。

class solution

else}}

for(itergreater = leastnumbers.begin();itergreater!=leastnumbers.end();++itergreater)

return result;

}};

面試題40 最小k個數

題目 輸入n個整數,找出其中最小的k個數 思路 1 如果輸入的陣列可以改變,則基於第k個數來調整,是第k個數左邊的數都小於第k個數,右邊的數都大於第k個數 時間複雜度o n 思路1 void printkminnumberbymethod1 int arr,int length,int k int ...

面試題40 最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8 這8個數字,則最小的4個數字是1 2 3 4。分析 這道題最簡單的思路莫過於把輸入的n個整數排序,排序之後位於最前面的k個數就是最小的k個數,這種思路的時間按複雜度是o nlogn 2.1 方法一 時間複雜度為o n 的演算...

面試題40 最小的K個數

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法一 不修改原陣列,時間複雜度o nlgk class solution if result k 1 input i result k 1 input i return...