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