利用快速排序的思想,每一次找到一个基准数并确定这一个基准数的位置,得到这个数的下标,再根据其下标大小来确定是向左区间找还是向右区间找;这里每一次都要讲小于基准数的搞到左边,大于基准数的搞到右边,那么就能在接近于O(n)的时间内得到答案。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int a[1000000];
int f[1000000];
void dfs(int L,int R)
{
if (L == R && L == k)
{
printf("%d",a[k]);
return;
}
int i=L,j=R,p=a[L];
while (i < j)
{
while (i < j && a[j] > p) j --;
if (i < j) swap(a[i],a[j]);
while (i < j && a[i] <= p) i ++;
if (i < j) swap(a[i],a[j]);
}
if (i == k) printf("%d",a[i]);
else if (i<k) dfs(i+1,R);
else dfs(L,i-1);
}
int main(void)
{
scanf("%d %d",&n,&k);
for (int i=1,x;i<=n;++i)
{
scanf("%d",&x);
if (f[x] == 0)
a[++m]=x,f[x]=1;
}
if (m < k) return printf("NO RESULT"),0;
else return dfs(1,m),0;
}