思路1:排序,分割数组即可。
思路2:大根堆的实现,由于是最小的K个值,所以我们将大根堆的容量设置为K,当大根堆不满时,直接向其中添加数据,当满时对比堆顶和插入值的大小,如果比堆顶小,那么就将堆顶删除,然后插入数据。当插入结束,堆中的所有数据都是此序列的最小的K个数。那么我们就使用优先级队列来实现。
public int[] getLeastNumbers(int[] arr, int k) {
if(k == 0) {
return new int[0];
}
Queue<Integer> queue = new PriorityQueue<>((a, b) -> (b - a));
for(int i: arr) {
if(queue.size() < k) {
queue.add(i);
} else {
if(queue.peek() > i) {
queue.remove();
queue.add(i);
}
}
}
int[] ref = new int[k];
int cnt = 0;
while(queue.size() > 0) {
ref[cnt++] = queue.remove();
}
return ref;
}
思路3:桶思想,由于给定参数的限制我们可以利用桶思想进行排序。遍历arr之后,把值对应到桶,有几个相同的值,那么对应的桶的值+1。最后遍历桶。
public int[] getLeastNumbers(int[] arr, int k) {
int[] res = new int[k];
if(k == 0) return res;
if(k == arr.length) return arr;
//桶思想
int[] bulck = new int[100001];
for(int i = 0 ; i < arr.length;i++){
bulck[arr[i]]++;
}
//遍历bluck,去出不为0的下标
int index = 0;
for(int i = 0 ; i < bulck.length;i++){
while(bulck[i]!=0){
res[index++] = i;
bulck[i]--;
if(index == k) return res;
}
}
return res;
}