【贪心】【数组】【2023-10-18】
对数组执行k次操作后可以得到的最大分数。操作指的是从数组中拿出一个数 num
,分数指的是拿的这个数的值,每拿完一个数还要将 ceil(num / 3)
放回数组。
为了获取最大的分数,每次从数组中选择最大的数 num
,并将 ceil(num / 3)
加入到数组中。
为了方便取出数组中的最大值以及更新数组后的最大值,我们可以维护一个优先队列来放置数组中的元素以及更新得到的元素。建立优先队列的时间复杂度为
O
(
l
o
g
n
)
O(logn)
O(logn),
n
n
n为数组 nums
的长度,空间复杂度为
O
(
l
o
g
n
)
O(logn)
O(logn)。从优先队列中选出最大元素的时间复杂度为
O
(
1
)
O(1)
O(1)。
实现代码
class Solution {
public:
long long maxKelements(vector<int>& nums, int k) {
long long res = 0;
priority_queue<long long>pq;
for(int num : nums) {
pq.push(num);
}
while (k --) {
long long tmp = pq.top();
res += tmp;
pq.pop();
pq.push((tmp + 2) / 3);
}
return res;
}
};
复杂度分析
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)。
空间复杂度: O ( l o g n ) O(logn) O(logn)。
import heapq
class Solution:
def maxKelements(self, nums: List[int], k: int) -> int:
pq = []
for num in nums:
heapq.heappush(pq, -num)
res = 0
while k:
maxVal = heapq.heappop(pq)
res += -maxVal
heapq.heappush(pq, floor(maxVal / 3))
k -= 1
return res
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。