Heap,排序 matrix 中的 two pointers
最无脑的写法,复杂度 O(k * log(mn)),minHeap 里把所有可能的 pair 都存进去了。
public class Solution {
private class MyComparator implements Comparator<int[]>{
public int compare(int[] a, int[] b){
return a[0] + a[1] - b[0] - b[1];
}
}
public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<int[]> list = new ArrayList<>();
PriorityQueue<int[]> minHeap = new PriorityQueue<int[]>(new MyComparator());
for(int i = 0; i < nums1.length; i++){
for(int j = 0; j < nums2.length; j++){
minHeap.offer(new int[]{nums1[i], nums2[j]});
}
}
while(!minHeap.isEmpty() && k > 0){
list.add(minHeap.poll());
k--;
}
return list;
}
}那么显然的优化是,既然我们只要 k 个答案,heap 里存 k 个就行,同时要尽可能的利用数组已经排好序的特性, 让 index 单调向前走。
O(k log k) ~ 超过 81%
这是一个借用 heap 的 two pointer 算法。
Last updated