N個數,求第K大數

2021-07-11 05:07:24 字數 491 閱讀 8828

今天同學給我出了一道題是這樣的:

有n個不重複的數,這n個數可以放入記憶體中,讓你用最快的方法找到第k大的數。

解答:一般情況我們可能考慮,先將n個數排序(快排序、堆排序),然後可以得到結果。但是當n很大時這樣做的效率會很低。所以我們提出一種更高效的方法:

利用快速排序的特點:第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小(降序),當左邊區間大於k時,說明我們求的第k大數在左邊區間,這時我們可以捨棄右邊區間,將範圍縮小到左邊區間從而重複上述過程,直到確定乙個數的位置時,左邊區間的小是k-1那麼這個數字就是我們所求。右邊同理。

分析:能夠使用這種方法的前提條件是:n個數不能重複。如果n個數中有重複,那麼區間的大小不能保證就是第k大。

例如:

444433221:其中3是第二大數,但是他的左邊有4個數。

所以當題目變成:有n個重複的數,求第k大數時,我們不能直接用上面的方法。

那麼我們改怎麼解決呢?

去掉重複!

N個數,求第K大數

有n個不重複的數,這n個數可以放入記憶體中,讓你用最快的方法找到第k大的數。解答 一般情況我們可能考慮,先將n個數排序 快排序 堆排序 然後可以得到結果。但是當n很大時這樣做的效率會很低。所以我們提出一種更高效的方法 利用快速排序的特點 第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小...

求第K大數

問題 a 求第k大數 時間限制 1 sec 記憶體限制 128 mb 提交 483 解決 172 提交 狀態 討論版 命題人 外部匯入 題目描述 求第k大的數 kth.pas c cpp 給定乙個長度為n 1 n 1,000,000 的無序正整數序列,以及另乙個數k 1 k 1,000,000 關於...

求第k大數

quad 求乙個序列裡面第k大的數,用partition可以再o n o n o n 時間複雜度內求解 對數a left,right 進行一次partition操作後,主元pivot左側元素都小於它,右側都大於它。設 pivot索引為p,則pivot是第p left 1大元素。求第k大時,若k p ...