题目:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
/* 方法基本思路:使用快速排序,但不需要对整个数组进行排序,进去找到分区索引为k的元素,该元素左边k个数就是最小的k个数。 */ class Solution { public int[] getLeastNumbers(int[] arr, int k) { int left = 0; int right = arr.length-1; quickSort(arr,left,right,k); int[] res = new int[k]; for(int i = 0;i < k;i++){ res[i] = arr[i]; } return res; } public void quickSort(int[] arr,int left,int right,int k){ if(left > right){ return; } int index = getIndex(arr,left,right); if(index == k){ //不需要把整个数组排序,只需当分区索引为k时,它的左侧k个数就是最小的k个数,例如对于数组[0,1,2,3,4,5],寻找到索引3的位置,左边3个数0,1,2就是最小的3个数。 return; } quickSort(arr,left,index-1,k); quickSort(arr,index+1,right,k); } public int getIndex(int[] arr,int left,int right){ int tmp = left; while(left<right){ while(left<right && arr[right]>=arr[tmp]){ right--; } while(left<right && arr[left]<=arr[tmp]){ left++; } if(left<right){ swap(arr,left,right); }else{ break; } } swap(arr,left,tmp); return left; } void swap(int[] arr,int i,int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }