题目:
给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。
示例:
输入: 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]
源码:
class Solution {
static class Pair implements Comparable<Pair> {
public int n1;
public int n2;
public int sum;
public Pair(int n1, int n2) {
this.n1 = n1;
this.n2 = n2;
this.sum = n1 + n2;
}
@Override
public int compareTo(Pair o) {
// this, other
// 如果希望 this 在前 other 在后, 返回 < 0
// 如果希望 this 在后 other 在前, 返回 > 0
// 如果希望相等, 返回 0
if (this.sum < o.sum) {
return 1;
}
if (this.sum > o.sum) {
return -1;
}
return 0;
}
}
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result = new ArrayList<>();
if (k < 1) {
return result;
}
PriorityQueue<Pair> queue = new PriorityQueue<>();
for (int i = 0; i < nums1.length && i < k; i++) {
for (int j = 0; j < nums2.length && i < k; j++) {
queue.offer(new Pair(nums1[i], nums2[j]));
if (queue.size() > k) {
queue.poll();
}
}
}
while (!queue.isEmpty()) {
Pair pair = queue.poll();
List<Integer> tmp = new ArrayList<>();
tmp.add(pair.n1);
tmp.add(pair.n2);
result.add(0, tmp);
}
return result;
}
}