元素个数为K的大顶堆或者快速选择
最小的K个数
http://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
请首先做参数合法性判断:k<=0或者k>input.length时,直接返回空
topK,先添加,当元素个数>k时,移除堆顶元素。
/** *输入n个整数,找出其中最小的K个数。 * 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 * @param input n个整数 * @param k K * @return 其中最小的K个数 */ public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { //首先请做合法性判断 if(input==null||input.length==0||k<=0||k> input.length){ return new ArrayList<>(0); } PriorityQueue<Integer> pq=new PriorityQueue<>(k,(a,b)->b.compareTo(a)); for(int num:input){ pq.add(num); if(pq.size()>k){ pq.remove(); } } return new ArrayList<>(pq); //或者,使用quickSelect。直接 return quickSelect(input, 0, input.length - 1, k - 1); } public ArrayList<Integer> quickSelect(int[] nums,int left,int right,int k){ int pivotIndex=partation(nums,left,right); if(pivotIndex==k){ ArrayList<Integer> res=new ArrayList<>(); for(int i=0;i<=k;i++){ res.add(nums[i]); } return res; } return pivotIndex>k?quickSelect(nums,left,pivotIndex-1,k):quickSelect(nums,pivotIndex+1,right,k); } private int partation(int[] nums,int left,int right){ int pivot=nums[left]; while (left<right){ while (left<right&&pivot<=nums[right]){ right--; } nums[left]=nums[right]; while (left<right&&nums[left]<=pivot){ left++; } nums[right]=nums[left]; } nums[left]=pivot; return left; }