第k大的數

2021-09-20 21:23:48 字數 1495 閱讀 3444

在許多題目中都會出現尋找第k大的數的類似問題,最簡單的做法就是先排序在找位置就可以找到第k大的數,但是排序的做法顯然不能滿足我們的要求,排序的時間複雜度是o(nlogn),不夠快,我們一般可以用快速排序的思想,用o(n)的時間內就可以找到第k大的數,這裡我們只講解c++ stl的函式nth_element。

先看一下stl

template

inline

void

nth_element

(_ranit _first, _ranit _nth, _ranit _last, _pr _pred)

template

inline

void

nth_element

(_ranit _first, _ranit _nth, _ranit _last)

從stl中可以看出nth_element可以帶3個或者4個引數,第乙個就是尋找的陣列或者容器開始的位置,第二個就是尋找的第k大的數,第三個就是尋找的數字或者容器結束的位置。

如果用於陣列:

#include

#include

#include

using namespace std;

intmain()

;nth_element

(a, a +

5, a +

10, std:

:greater<

int>()

);cout <<

"陣列中的中間元素是"

<< a[5]

<< endl;

nth_element

(a, a, a +

10, std:

:greater<

int>()

);cout <<

"陣列中第1大元素為"

<< a[0]

<< endl;

nth_element

(a, a +

1, a +

10, std:

:greater<

int>()

);cout <<

"陣列中第2大元素是"

<< a[1]

<< endl;

}

如果用於容器vector:

#include

#define pb push_back

using namespace std;

intmain()

如果加上第4個引數,那麼就是要進行自定義查詢了,自定義的查詢方式。

比如對結構體進行自定義的方式的查詢

struct node

t[n*10]

;int

cmp(node a,node b)

nth_element

(t+1

,t+k,t+n+

1,cmp)

;

第k大的數,前k大的數

1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...

第K大的數

這道題是我去年聽說的,一次比賽悲劇的,前幾天ac的,大體思路是二分答案,記住在統計的時候,複雜度為n,而不是nlogn,這道題複雜度為 nlog max min include include includeusing namespace std define maxn 51000 int64 a ...

第k大的數

題目 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數。例如 a 1 2 3,b 2 3 4。a與b組合成的c包括2 3 4 4 6 8 6 9 12共9...