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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。