题目描述
输入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; } }