題解 AcWing 786 第K個數

2021-10-22 16:20:38 字數 1338 閱讀 4233

acwing 786.第k個數

引用

星丶空大佬的題解,很不錯的思路,奇怪的思路+1 並沒有

寫乙個和yxc大佬不同但差不多思想的方法,**更簡單

給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列從小到大排序後的第k個數。

樣例輸入格式

第一行包含兩個整數 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 ...