题目链接:牛客NC119最小的K个数
题目描述:
先排序找最小的几个数很简单,也可以用优先队列写,这里为了练习排序就用归并写了
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if(k>input.length)return new ArrayList();
ArrayList<Integer> list=new ArrayList<>();
sortmerge(input,new int[input.length],0,input.length-1);
for(int i=0;i<k;i++){
list.add(input[i]);
}
return list;
}
public void merge(int[] input,int[] temp,int start,int end){
int l=start,mid=(start+end)/2,r=mid+1,cnt=start;
while(l<=mid&&r<=end){
if(input[l]>input[r])temp[cnt++]=input[r++];
else temp[cnt++]=input[l++];
}
while(l<=mid)temp[cnt++]=input[l++];
while(r<=end)temp[cnt++]=input[r++];
for(int i=start;i<=end;i++){
input[i]=temp[i];
}
}
public void sortmerge(int[] input,int[] temp,int start,int end){
if(start>=end)return;
int mid=(start+end)/2;
sortmerge(input,temp,start,mid);
sortmerge(input,temp,mid+1,end);
merge(input,temp,start,end);
}