刷題之路 最小的K個數

2021-07-15 20:48:58 字數 421 閱讀 4056

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

最優方法可以做到n*log(k)。做法就是使用堆排序,只維護乙個規模為k的大根堆,之後遍歷所有的數字,一旦後面數字比堆頂小,則交換兩數,並重新調整大根堆,遍歷完成後堆中元素就是最小的k個數(但是這k個數不一定是排序的)

**如下:

class solution

for(i=0;i&num,int n)

}void fixdown(vector&num, int i,int n){ //這裡的n是下標,所以之前的fixdown要是n-1

int j;

int flag=1;

while(2*i+1=n) j=2*i+1;

else{

if(num[2*i+2]

刷題劍指offer 最小的k個數

思路 1 快排 用partition函式,只是不是和中間的比較而是和第k個比較 2 堆排 最大堆。在最大堆中,根節點的值總是大於它的子樹中任意節點的值。於是我們每次可以在o 1 得到已有的k個數字中的最大值,但需要o logk 時間完成刪除以及插入操作。使用stl的set和multiset實現 思路...

菜鳥刷題之路 Q27 移除K個數字

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 分析 本題使用貪心加單調棧的方式,刪除k個數即保證在刪除到k個數之前,我刪除的數都是較大的數。貪心策略就是使用單調棧。具體的流程 的注釋有解釋。class solution 當壓入的數小於棧頂,或者壓入的數已...

第40題 最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,法1,std sort。快排onlogn class solution return ret 法2.partiton on include using namespace std ...