暴力小根堆
初始化优先级队列的容量为k,保留k个元素在优先级队列中,这个在代码的for循环里有体现,如果多于k个,就削掉堆顶元素。由于Java官方的PriorityQueue为小根堆实现,所以不改变比较策略的话,队列里的k个元素就是前k大的,其中堆顶是前k大中最小的。将比较策略反过来的话,队列里的k个元素就是前k小的,其中堆顶是前k小中最大的。
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> list = new ArrayList<>();
k = Math.min(k,nums1.length*nums2.length); //注意k的取值
if(k==0) return list;
PriorityQueue<Integer[]> minBinaryHeap = new PriorityQueue<>(k,(o1,o2)->o2[0]+o2[1]-o1[0]-o1[1]);
for(int num1 : nums1){
for (int num2 : nums2){
minBinaryHeap.offer(new Integer[]{num1,num2});
if (minBinaryHeap.size() > k){
minBinaryHeap.poll();
}
}
}
while(k-->0){
Integer[] e = minBinaryHeap.poll();
list.add(0,Arrays.asList(e[0],e[1]));
}
return list;
}
}
学到的东西
1.
PriorityQueue<Integer[]> minBinaryHeap = new PriorityQueue<>(k,(o1,o2)->o2[0]+o2[1]-o1[0]-o1[1]);
k为优先级队列的初始容量,存入的元素为o1类型,->后边的表示比较策略,
2.
list.add(0,Arrays.asList(e[0],e[1]));
Arrays.asList(T 动态参数)
将数组转换成链表。