查找和最小的K对数字
https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/solutions/1208350/cha-zhao-he-zui-xiao-de-kdui-shu-zi-by-l-z526/?envType=study-plan-v2&envId=top-interview-150
我这里解释一下题解的方法一,刚看的时候还是挺抽象的
class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {// 优先队列(存放的是下标,通过下标对应的数字和升序)PriorityQueue<int[]> pq = new PriorityQueue<>(k, (o1, o2)->{return nums1[o1[0]] + nums2[o1[1]] - nums1[o2[0]] - nums2[o2[1]];});List<List<Integer>> ans = new ArrayList<>();int m = nums1.length;int n = nums2.length;// 初始化优先队列,将nums1的前min(m, k)个元素和nums2的第一个元素组成对放入优先队列for (int i = 0; i < Math.min(m, k); i++) {pq.offer(new int[]{i,0});}// 从优先队列中取出k个元素,组成k个最小的对放入结果列表中while (k-- > 0 && !pq.isEmpty()) {int[] idxPair = pq.poll();List<Integer> list = new ArrayList<>();list.add(nums1[idxPair[0]]);list.add(nums2[idxPair[1]]);ans.add(list);// 这里尝试将nums1[idxPair[0]]和没有组合过的nums2中的元素组成对放入优先队列if (idxPair[1] + 1 < n) {pq.offer(new int[]{idxPair[0], idxPair[1] + 1});}}return ans;}public static void main(String[] args) {Solution solution = new Solution();System.out.println(solution.kSmallestPairs(new int[]{1, 7, 11}, new int[]{2, 4, 6}, 3));}
}