373. 查找和最小的K对数字
分析
-
初始化最小堆:
- 初始时,最小堆可以由
nums1[0]和nums2[i](i从0到m-1)组成,因为nums1和nums2都是有序的,最小的数对总是以nums1[0]开头与nums2的元素组合 - 每个堆元素包含一个三元组
[sum, i, j],其中sum是当前数对的和,i是nums1的索引,j是nums2的索引
- 初始时,最小堆可以由
-
使用堆来不断提取和最小的数对:
- 每次从堆中取出和最小的数对,并将其加入结果集。
- 如果
nums1[i+1]和nums2[j]存在,推入堆中新的数对nums1[i+1]和nums2[j]的组合
-
堆的操作:
- 每次都取出和最小的数对进行处理,直到得到
k个数对
- 每次都取出和最小的数对进行处理,直到得到
时间复杂度
- 初始化堆:将
nums2中的每个元素与nums1[0]配对,复杂度为O(mlogm),其中m是nums2的大小 - 每次弹出和插入操作的时间复杂度为
O(logk)
总体时间复杂度为 O(klogk),其中 k 是要求的数对个数
空间复杂度
空间复杂度为 O(k)
C++代码
|
|