有n个数,请你找出第k小的数。
输入描述
第一行有2个正整数n,k(n,k<=10^6)
第二行有n个非负数ai(ai<=10^5)
输出描述
输出第k小的数。
样本输入
5 2
1 5 3 4 5
样本输出
3
快排后直接找第k小的数
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[100005];
int main()
{
int x,y,z,t,k,n;
scanf("%d%d",&n,&k);
for(x=0;x<n;x++)
{
scanf("%d",&a[x]);
}
sort(a,a+n);
z = 0;
for(x=0;x<n;x++)
{
if(a[x]!=a[x+1])
{
z++;
}
if(z==k-1)
{
printf("%d\n",a[x+1]);
break;
}
}
return 0;
}
用数组存k个数,其中最大的数为kmax,输入一个数判断是否比kmax小,如果比kmax小就把kmax替换,再重新排序,找出新的kmax。
但要注意数组中的数字不可以相同。
#include <stdio.h>
#include <algorithm>
using namespace std;
#define Max 10000
int a[100005]={0};
int main()
{
int x,y,z,t,n,k,num,flag;
scanf("%d%d",&n,&k);
for(x=0;x<k;x++)
{
a[x] = Max;
}
for(x=0;x<n;x++)
{
scanf("%d",&t);
if(t<a[k-1])
{
flag = 0;
for(y=0;y<k;y++)
{
if(t==a[y])
{
flag = 1;
break;
}
}
if(!flag)
{
a[k-1] = t;
sort(a,a+k);
}
}
}
printf("%d\n",a[k-1]);
return 0;
}