给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是4,1,2,3(按照原数组顺序输出)。
数据范围:0<k,n<=10000,n>=k,数组中每个数的大小0<=val<=1000,
输入格式:
输入第一行长度n,个数k
第二行数组的各个元素
输出格式:
按原数组顺序输出最小的k个数,每个数的后面均有空格
输入样例:
在这里给出一组输入。例如:
8 4
4 5 1 6 2 7 3 8
输出样例:
在这里给出相应的输出。例如:
4 1 2 3
思路:先对数据进行排序,确定最小值k个数的范围,然后遍历原始数据,对符合范围要求的数据进行输出,但要特别注意的是要确定最小K个数中最大值的个数,输出完最大值的个数后再不能对最大值进行输出。
#include<stdio.h>
int main()
{
int n,m,min,max,maxcount=0;
int data[10000],a[10000];
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
data[i]=a[i];
}
for(int i=0;i<n-1;i++)
{
min=i;
for(int j=i+1;j<n;j++)
{
if(data[j]<data[min])
{
min=j;
}
}
if(min!=i)
{
int temp=data[i];
data[i]=data[min];
data[min]=temp;
}
}
max=data[0];
min=data[0];
for(int i=1;i<m;i++)
{
if(data[i]>max)
{
max=data[i];
}
if(data[i]<min)
{
min=data[i];
}
}
for(int i=0;i<m;i++)
{
if(data[i]==max)
{
maxcount++;
}
}
for(int i=0;i<n;i++)
{
if(a[i]>=min&&a[i]<=max)
{
if(a[i]==max&&maxcount!=0)
{
printf("%d ",a[i]);
maxcount--;
}
if(a[i]!=max)
{
printf("%d ",a[i]);
}
}
}
}