AcWing 786 第k個數(C 演算法)

2021-10-07 20:40:15 字數 1050 閱讀 2288

輸入格式

第一行包含兩個整數 n 和 k。

第二行包含 n 個整數(所有整數均在1~109範圍內),表示整數數列。

輸出格式

輸出乙個整數,表示數列的第k小數。

資料範圍

1≤n≤100000,

1≤k≤n

輸入樣例:

5 32 4 1 5 3

輸出樣例:

32、基本思想:

用快速選擇演算法。當分界點x左邊(有sl個數)全比它小右邊(有sr個數)全比它大的時候,若k<=sl,則只需在x左邊選擇第k小的數,反之則在x右邊選擇第(k - sl)小的數。

3、步驟:

①找分界點x:q[l]、q[(l + r)/2]、q[r]都可以。

②將x左右兩邊排好,使得左邊數都小於x,右邊數都大於x。

③視情況選擇遞迴x左邊的還是遞迴x右邊的。

#include

intquick_sort

(int l,

int r,

int k)

;using

namespace std;

const

int n =

1e5+10;

int n, k;

int q[n]

;int

main()

intquick_sort

(int l,

int r,

int k)

int sl = j - l +1;

//上面的迴圈結束之後i == j,用i或是用j都一樣

if(k <= sl)

return

quick_sort

(l, j, k)

;//遞迴排左邊

else

return

quick_sort

(j +

1, r, k - sl)

;//遞迴排右邊

}//該**引用acwing****

注意事項:

用快速選擇演算法時間複雜度比用快排要低,故此處只挑選其中一邊遞迴。

題解 AcWing 786 第K個數

acwing 786.第k個數 引用星丶空大佬的題解,很不錯的思路,奇怪的思路 1 並沒有 寫乙個和yxc大佬不同但差不多思想的方法,更簡單 給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列從小到大排序後的第k個數。樣例輸入格式 第一行包含兩個整數 n 和 k。第二行包含 n ...

ACWING刷題 786 第k個數

原題鏈結 做法 快速排序為基礎,用k與當前區間長度比較,進行區間剪枝,時間複雜度o 2n include using namespace std const int n 100010 int a n int quick sort int l,int r,int k int llen j l 1 左區...

AcWing 1289 序列的第k個數

bsny 在學等差數列和等比數列,當已知前三項時,就可以知道是等差數列還是等比數列。現在給你整數序列的前三項,這個序列要麼是等差序列,要麼是等比序列,你能求出第k項的值嗎。如果第k項的值太大,對其取模200709200907 include define mod 200907 using names...