acwing 786.第k個數
引用
星丶空大佬的題解,很不錯的思路,奇怪的思路+1 並沒有給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列從小到大排序後的第k個數。寫乙個和yxc大佬不同但差不多思想的方法,**更簡單
樣例輸入格式
第一行包含兩個整數 n 和 k。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整數數列。
輸出格式
輸出乙個整數,表示數列的第k小數。
資料範圍
1 ≤n
≤100000
1≤n≤100000
1≤n≤10
0000,1≤
k≤
n1≤k≤n
1≤k≤n
輸入樣例:
5 3
2 4 1 5 3
輸出樣例:3
(快速選擇) o(n
)o(n)
o(n)
從快排的性質可以知道,每次劃分區間的時候j左邊的數都是小於等於x的,右邊的都是大於等於x的。所以如果左區間的長度大於等於k,那麼第k個數必定在左區間,所以我們只需遞迴左區間,反過來,如果k大於左區間長度,那麼第k個數在右區間,那麼相對於右區間,第k個數在右區間中變為第(k - 左區間的長度)個數,然後遞迴右區間即可。
時間複雜度 o(n
)o(n)
o(n)
emmm,問就是不知道怎麼算的,不過肯定比 o(n
logn
)o(nlogn)
o(nlog
n)小,等我看了y總的時空複雜度分析再來補吧,哈哈哈
c++ **
#include
#include
using
namespace std;
const
int n =
1e5+10;
int n , k;
int a[n]
;int
quick_sort
(int q,
int l ,
int r ,
int k)
int len = j - l +1;
if(len >= k)
return
quick_sort
(q , l , j , k)
;else
return
quick_sort
(q , j +
1, r , k - len);}
intmain()
AcWing 786 第k個數(C 演算法)
輸入格式 第一行包含兩個整數 n 和 k。第二行包含 n 個整數 所有整數均在1 109範圍內 表示整數數列。輸出格式 輸出乙個整數,表示數列的第k小數。資料範圍 1 n 100000,1 k n 輸入樣例 5 32 4 1 5 3 輸出樣例 32 基本思想 用快速選擇演算法。當分界點x左邊 有sl...
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 左區...
786 第 K 個最小的素數分數
乙個已排序好的表 a,其包含 1 和其他一些素數.當列表中的每乙個 p那麼第 k 個最小的分數是多少呢?以整數陣列的形式返回你的答案,這裡 answer 0 p 且 answer 1 q.示例 輸入 a 1,2,3,5 k 3 輸出 2,5 解釋 已構造好的分數,排序後如下所示 1 5,1 3,2 ...