目標用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很大時這樣做的效率會很低。所以我們提出一種更高效的方法 利用快速排序的特點 第一遍排序會確定乙個數的位置,...