LeetCode373.查找和最少的K对数字
给定两个以 升序排列 的整数数组和, 以及一个整数。
定义一对值,其中第一个元素来自,第二个元素来自。
请找到和最小的个数对。
提示:
- 和均为升序排列
思路:
设,。那么总共可以组成对数。因为两个数组有序。所以以下各个数对的和也是有序的。
所以可以使用优先队列(小根堆)存每行的第一个数对和,每次弹出队首元素必然就是当前最小值,并将该行的下一个数对和存入优先队列即可。
Java代码如下:
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> res = new ArrayList<>();
PriorityQueue<int[]> q = new PriorityQueue<>((a,b) -> a[0] - b[0]);
int n = nums1.length, m = nums2.length;
for(int i = 0;i < m;i++) {
q.offer(new int[]{nums1[0] + nums2[i], 0 ,i});
}
while(q.size() > 0 && res.size() < k) {
int[] p = q.poll();
List<Integer> list = new ArrayList<>();
list.add(nums1[p[1]]);
list.add(nums2[p[2]]);
res.add(list);
if(p[1] + 1 < n) {
q.offer(new int[]{nums1[p[1]+1]+nums2[p[2]], p[1] + 1, p[2]});
}
}
return res;
}
}