题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
利用快速排序的partion 来解决
如果基于数字的第k个数字来调整,使得比第k个数字小的数字都位于数组的左边,比k个数字大的所有数字都位于数组右边。这样 调整之后,位于数组中左边的k个数字就行最小的k个数字(这k个不一定有序)。
如果基于数字的第k个数字来调整,使得比第k个数字小的数字都位于数组的左边,比k个数字大的所有数字都位于数组右边。这样 调整之后,位于数组中左边的k个数字就行最小的k个数字(这k个不一定有序)。
1 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { 4 ArrayList<Integer> res = new ArrayList<Integer>(); 5 if(k>=input.length||k==0){ 6 if(k==input.length){ 7 for(int m=0;m<k;m++) 8 res.add(input[m]); 9 } 10 return res; 11 } 12 13 14 int start =0; 15 int end = input.length-1; 16 17 int j = partion(input,start,end); 18 while(j!=k-1){ 19 if(j<k-1){ 20 start=j+1; 21 j = partion(input,start,end); 22 } 23 else{ 24 end=j-1; 25 j = partion(input,start,end); 26 } 27 } 28 29 for(int m=0;m<k;m++) 30 res.add(input[m]); 31 return res; 32 } 33 private int partion(int a[] ,int lo,int hi){ 34 int i = lo; 35 int j = hi+1; 36 int v = a[lo]; 37 while(true){ 38 while(a[++i]<v) if(i>=hi) break; 39 while(a[--j]>v) if(j<=lo) break; 40 if(i>=j) break; 41 swap(a,i,j); 42 } 43 swap(a,j,lo); 44 return j; 45 } 46 private void swap(int[] a,int i,int j){ 47 int temp = a[j]; 48 a[j] = a[i]; 49 a[i] = temp; 50 } 51 52 }