题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
解题思路
利用快速排序的思路-以第一个元素为界,将比它小的放在它的左侧,将比它大的,放在它的右侧
而我们是要最小的k个数,并不要求这k个数的顺序
则依次进行快速排序
根据示例可知,以4为关键元素,得出前3个比4小,后4个比4大。
如果k==3或者k==4,则直接输出input的前k个元素就好
如果k<3,则对前半段再进行快排,还是找前k个元素
如果k>4,则对后半段再进行快排,寻找前k-4个元素(因为前边4个已经出来了)
java代码实现如下: 15ms 9924KB
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> ans=new ArrayList<>();
if(k>input.length || k==0){
return ans;
}
get(input,0,input.length,k);
for(int i=0;i<k;i++){
ans.add(input[i]);
}
return ans;
}
public void get(int[] input,int p,int r,int k){
int q=getindex(input,p,r);
System.out.println(q);
for(int i=0;i<input.length;i++){
System.out.print(input[i]+" ");
}
System.out.println();
if(k<q){
get(input,0,q,k);
}
else if(k>q+1){
get(input,q+1,input.length,k-q-1);
}
}
public int getindex(int[] input,int p,int r){
int i=p;
int j=r;
int key=input[i];
while(true){
while(input[++i]<key && i<j);
while(input[--j]>=key);
if(i>=j) break;
int tmp=input[i];
input[i]=input[j];
input[j]=tmp;
}
input[p]=input[j];
input[j]=key;
return j;
}
}
京公网安备 11010502036488号