https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/
首先应该想到的是,这是一个双层遍历,但由于数据的规模是1<=nums.length<=10^5,直接遍历肯定超时,因此在代码中需要去掉一些不必要的比较;其次查找和最小的k对数字,需要一个能边存储边比较的数据类型,且它有序,因此选择优先队列,且需要重写compare方法进行逆序让最大值在首位,方便通过peek方法比较
剪枝:题目所给的数组为升序数组,当nums[i]+nums[j] 大于队头元素时,内层循环剩下的比较一定会大于队头元素,因此可以直接进行下一次循环
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
Queue<int[]> queue = new PriorityQueue<int[]>((a,b)->{
return b[0] - a[0];
});
for(int n1 : nums1) {
for(int n2 : nums2) {
int temp = n1+n2;
if(queue.size() == k) {
if(queue.peek()[0]>temp) {
queue.poll();
queue.offer(new int[] {temp,n1,n2});
}else
break;
}else {
queue.offer(new int[] {temp,n1,n2});
}
}
}
for(int[] arr : queue) {
List<Integer> list = new ArrayList<Integer>();
list.add(arr[1]);
list.add(arr[2]);
result.add(list);
}
return result;
}
}