Given nums1 = [1,7,11], nums2 = [2,4,6],  k = 3

Return: [1,2],[1,4],[1,6]

The first 3 pairs are returned from the sequence:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
利用pq特点进行排序。
我们需要构建一个数据结构,一个pos表示在nums1的位置,一个pos表示在nums2的位置,他们的和,用来排序。
我们首先向PQ里offer,nums1[0] 和 所有nums2的元素的和。
每次我们poll一组数,然后增加nums1的pos, pq会自然的进行排序。操作K次就行了。
public class Solution {
    public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<int[]> res = new ArrayList<int[]>();
        if(nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0 || k < 0) return res;
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                return a[2] - b[2];
            }
        });
        
        int m = nums1.length, n = nums2.length;
        for(int i = 0; i < n; i++){
            // t[0] pos in nums1, t[1] pos in nums2, val nums[t[0]]+nums[t[1]]
            pq.offer(new int[]{0, i, nums1[0] + nums2[i]});
        }
        
        for(int i = 0; i < Math.min(k, m*n); i++){
            int[] t = pq.poll();
            res.add(new int[]{nums1[t[0]], nums2[t[1]]});
            if(t[0] == m-1) continue;
            pq.offer(new int[]{ t[0] + 1, t[1], nums1[t[0] + 1] + nums2[t[1]] });
        }
        
        return res;
    }
}

大米中的大米
12 声望5 粉丝

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解法。