思想:
case1:利用堆来实现,要找最小的k个数则构造一个大顶堆
要找最大的k个数则构造一个小顶堆
时间复杂度为O(nlogk)
空间复杂度为O(K)
case2:先利用快速排序的区间划分思想找到第K小元素所处位置min_k,然后此时arr[]中[0,min_k]即为所求的最小的k个数
case1:
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
int len = arr.length;
int[] res = new int[k];
if(len==0) return res;
PriorityQueue heap = new PriorityQueue<>(len,(v1,v2)-> v2-v1);
for(int i=0;ik){
heap.poll();
}
}
while(!heap.isEmpty()){
res[--k] = heap.poll();
}
return res;
}
}
case2:
class Solution {
public void swap(int[]arr,int idx1,int idx2){
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
public int paration(int[]arr,int start,int end){
//产生随机哨兵
Random r = new Random();
int sentinelIdx = start+Math.abs(r.nextInt())%(end-start);
//把哨兵元素给交换到队尾
swap(arr,sentinelIdx,end);
//将<=哨兵的元素给交换到队头
int idx = start;
for(int i=start;ik){
end = j-1;
}else{
break;
}
}
return Arrays.copyOf(arr,k);
}
}