373 Find K Pairs with Smallest Sums
1. Question
You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k.
Define a pair (u,v) which consists of one element from the first array and one element from the second array.
Find the k pairs(u1,v1),(u2,v2) ...(uk,vk)with the smallest sums.
Example 1:
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]Example 2:
Given nums1 = [1,1,2], nums2 = [1,2,3],  k = 2
Return: [1,1],[1,1]
The first 2 pairs are returned from the sequence:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]Example 3:
Given nums1 = [1,2], nums2 = [3],  k = 3 
Return: [1,3],[2,3]
All possible pairs are returned from the sequence:
[1,3],[2,3]2. Implementation
(1) Heap
class Solution {
    public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<int[]> res = new ArrayList<>();
        if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return res;
        }
        PriorityQueue<PairSum> minHeap = new PriorityQueue<>();
        int m = nums1.length, n = nums2.length;
        for (int j = 0; j < n; j++) {
            minHeap.add(new PairSum(0, j, nums1[0] + nums2[j]));
        }
        for (int i = 0; i < Math.min(k, m * n); i++) {
            PairSum curSum = minHeap.remove();
            int index1 = curSum.index1;
            int index2 = curSum.index2;
            res.add(new int[] {nums1[index1], nums2[index2]});
            if (index1 < m - 1) {
                minHeap.add(new PairSum(index1 + 1, index2, nums1[index1 + 1] + nums2[index2]));
            }
        }
        return res;
    }
    class PairSum implements Comparable<PairSum> {
        int index1;
        int index2;
        int sum;
        public PairSum(int index1, int index2, int sum) {
            this.index1 = index1;
            this.index2 = index2;
            this.sum = sum;
        }
        public int compareTo(PairSum that) {
            return this.sum - that.sum;
        }
    }
}3. Time & Space Complexity
Heap: 时间复杂度O(k * k *logk), 空间复杂度O(k)
Last updated
Was this helpful?