问题描述
查找和最小的K对数字。
输入: 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]
解决思路
建立一个优先队列,将所有可能条件放入队列中,队列的排序条件为和的值。
代码实现
public class Sloution {
//创建一个类存放数据
class pair {
public int num1;
public int num2;
public int sum;
public pair(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
this.sum = num1 + num2;
}
}
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result= new ArrayList<>();
if(k <= 0) {
return result;
}
//创建优先队列,给定排序条件。
PriorityQueue<pair> queue = new PriorityQueue<>(new Comparator<pair>() {
@Override
public int compare(pair o1, pair o2) {
return o1.sum - o2.sum;
}
});
//放入数据。
for(int i = 0;i < nums1.length;i++) {
for(int j = 0;j < nums2.length;j++) {
queue.offer(new pair(nums1[i],nums2[j]));
}
}
//取出前K个数据。
for(; k > 0 && !queue.isEmpty() ;k--) {
pair pair2 = queue.poll();
List<Integer> list = new ArrayList<>();
list.add(pair2.num1);
list.add(pair2.num2);
result.add(list);
}
return result;
}