查找和最小的 K 对数字
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 32 ms, 内存: 16.5 MB
/*
* 思路:
* 1. 使用嵌套的流生成所有可能的数对,并按和排序。
* 2. 取出前 k 个数对。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
return Arrays.stream(nums1)
.boxed()
.flatMap(u -> Arrays.stream(nums2).mapToObj(v -> new int[]{u, v}))
.sorted(Comparator.comparingInt(a -> a[0] + a[1]))
.limit(k)
.collect(Collectors.toList());
}
}
解释
方法:
本题解采用了最小堆(优先队列)的方法来解决问题。首先,将 nums1 中的前 k 个元素与 nums2 中的第一个元素组成的数对,以及它们的和作为优先级,加入最小堆中。然后,每次从堆中取出和最小的数对,将其加入答案列表中。同时,如果该数对的 nums2 元素不是 nums2 的最后一个元素,则将该数对的 nums1 元素与 nums2 中下一个元素组成的新数对加入堆中。重复这个过程,直到找到 k 对数或堆为空。
时间复杂度:
O(k log k)
空间复杂度:
O(k)
代码细节讲解
🦆
在选择初始化堆时,为什么只考虑了nums1中的元素与nums2中第一个元素组成的数对,而没有考虑nums2的元素与nums1中元素的组合?
▷🦆
在处理过程中,当从堆中取出一个数对后,为何只考虑该数对的nums1元素与nums2中的下一个元素组成新的数对,并没有考虑nums1中的下一个元素?
▷🦆
如果nums1或nums2为空数组,这个算法应该如何处理来避免错误或无效的操作?
▷