leetcode373-查找和最小的K对数字

原题

给定两个以升序排列的整形数组 nums1nums2, 以及一个整数 k

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2

找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)

示例1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6] 解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例2:

输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1] 解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

示例3:

输入: nums1 = [1,2], nums2 = [3], k = 3
输出: [1,3],[2,3] 解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]

解法

思想

可以把所有的二元组插入堆中,通过自定义的比较器来获取topk。

代码

class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        Queue<List<Integer>> queue = new PriorityQueue<>(
            new Comparator<List<Integer>>() {
            public int compare(List<Integer> o1, List<Integer> o2) {
                int ans = 0;
                for(Integer i:o1)
                    ans+=i;
                for(Integer i:o2)
                    ans-=i;
                return ans;
            }
        });
        for(int i:nums1){
            for(int j:nums2){
                List<Integer> list = new ArrayList<>();
                list.add(i);
                list.add(j);
                queue.add(list);
            }
        }
        for(int i = 0;i<k;i++){
            if(queue.isEmpty()) break;
            ans.add(queue.poll());
        }
        return ans;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode373-%e6%9f%a5%e6%89%be%e5%92%8c%e6%9c%80%e5%b0%8f%e7%9a%84k%e5%af%b9%e6%95%b0%e5%ad%97/