标签:for 长度 等于 遍历 lang 保存 容量 题目 NPU
题目描述
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
示例1
输入
[4,5,1,6,2,7,3,8],4
返回值
[1,2,3,4]
解题思路:这里用优先队列来做,让其容量始终为k个,等于k,并且当前遍历到的元素又比堆顶元素大,那就取出堆定元素并且插入新的元素,默认排好序,因此里面保存的始终是当前遍历到的最小的k个数,堆顶始终是里面最大的一个。PriorityQueue默认是小顶堆,因此要传入一个匿名类Comparator,重写compare方法,将其转化为大顶堆,然后用这个优先队列来保存中间元素,最后将其转换为数组返回。
代码 t80 s96 java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
int len = input.length;
ArrayList<Integer> res = new ArrayList<>();
if(len<k || k==0) return res;
PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i : input) {
if(pq.size()==k){
if(i<pq.peek()){
pq.poll();
pq.add(i);
}
}else {
pq.add(i);
}
}
res.addAll(pq);
return res;
}
}
参考资料:
标签:for 长度 等于 遍历 lang 保存 容量 题目 NPU
原文地址:https://www.cnblogs.com/zhengxch/p/14694673.html