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; } }