想到一个复杂度是O(n)的算法:维护一个目前扫描到的最小的k个元素。
#include<iostream>
#include<cstdlib>
#include<climits>
using namespace std;
int main()
{
// 复杂度O(n)
int n,k,a;// duck:上升
cin >> n >> k;
int duck[k] = {0};
for(int i = 0;i < k;i++)
{
duck[i] = INT_MAX;
}
for(int i = 0;i < n;i++)
{
cin >> a;
for(int j = 0;j < k;j++)
{
if(a < duck[j])
{
for(int l = k - 1;l > j;l--)
{
duck[l] = duck[l - 1];
}
duck[j] = a;
break;
}
}
}
for(int l = k - 1;l > 0;l--)
{
if(duck[l] < INT_MAX)
{
cout << duck[l];
break;
}
}
}