學習筆記 n個數里求kth

2021-10-24 15:34:17 字數 974 閱讀 2951

目標用o(n

)o(n)

o(n)

時間找到kth

kthkt

h 原題是noi

p2008

noip2008

noip20

08提高組的完形

用類似快排的思想,對於一段區間的數,每次選擇乙個點tmp

tmptm

p為樞軸點

需要保證排好以後,tmp

tmptm

p左邊的數都比它小,右邊的數都比它大

然後看看目標k

kk在左區間還是右區間,繼續具體排序

對於t mp

tmptm

p的選擇可以用隨機數,也可以用l+r

>

>

1l+r>>1

l+r>

>

1,實測後者其實更快

理論上複雜度是o(n

)o(n)

o(n)

的,但是其實要慢一點

code:

//#pragma gcc optmize("-ofast")

#include

#define maxn 10000010

using

namespace std;

int n, m, a[maxn]

;inline

intread()

intfind

(int l,

int r)

a[i]

= value;

if(i < m)

return

find

(i, r)

;else

if(i > m)

return

find

(l, i -1)

;else

return i;

}int

main()

求n個數的排列

如果給定n個不同字元,將這n個字元全排列,最終的結果將會是n 種。如 給定 a b c三個不同的字元,則結果為 abc acb bac bca cab cba一共3 3 2 6種情況。public class test6 public static void count vectorv1,vecto...

N個數,求第K大數

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

N個數,求第K大數

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