2542. 最大子序列的分数
分析
- 贪心策略:
- 优先选择
nums2
值较大的元素,以确保当前子序列的最小值较大,即min(nums2)
尽可能大,进而最大化分数
- 优先选择
- 降序排序:
- 将
nums2
和nums1
的对应元素组合成一个二元组nums2[i], nums1[i]
,并按nums2
降序排列,这样我们可以从最大值开始依次考虑子序列
- 将
- 优先队列维护和:
- 使用一个最小堆
min_heap
来动态维护当前选定子序列中nums1
的k
个元素的和 - 如果堆的大小超过
k
,移除堆顶(即当前最小的元素),从而保持堆的大小不超过k
- 这样可以保证始终以较大的元素尽量填满子序列
- 使用一个最小堆
- 更新最大分数:
- 每当堆的大小达到
k
,更新最大分数
- 每当堆的大小达到
时间复杂度
- 排序操作:
O(n \log n)
,其中n
是数组的长度 - 遍历
combine
并维护堆:O(nlogk)
,每次插入或删除堆顶操作需要O(logk)
总时间复杂度:O(nlogn + nlogk)
空间复杂度
- 使用了一个最小堆,大小为
O(k)
- 存储组合后的数组,空间为
O(n)
总空间复杂度:O(n + k)
C++代码
|
|