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++代码
|
|