请首先做参数合法性判断: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;
}