【每日一题】执行 K 次操作后的最大分数

文章目录

Tag

【贪心】【数组】【2023-10-18】


题目来源

2530. 执行 K 次操作后的最大分数


题目解读

对数组执行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)。

实现代码

cpp 复制代码
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)。


其他语言

python3

python3 复制代码
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

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

相关推荐
剪一朵云爱着2 小时前
力扣面试题 17.05. 字母与数字
算法·leetcode
虾球xz3 小时前
CppCon 2016 学习:GAME ENGINE USING C++11
大数据·开发语言·c++·学习
虾球xz3 小时前
CppCon 2016 学习:fixed_point Library
开发语言·c++·学习
code喵喵3 小时前
八种数据结构简介
数据结构·算法·推荐算法
HaiQinyanAN3 小时前
【学习笔记】nlohmannjson&&cjson
c++·笔记·学习·json
C语言小火车3 小时前
【C语言】银行账户管理系统丨源码+解析
c语言·c++·算法·课程设计
wen__xvn4 小时前
九日集训第三天
数据结构·算法·leetcode
dying_man4 小时前
LeetCode--33.搜索旋转排序数组
算法·leetcode
东方芷兰4 小时前
Leetcode 刷题记录 17 —— 堆
java·c++·b树·算法·leetcode·职场和发展
lzb_kkk4 小时前
【MFC】编辑框、下拉框、列表控件
c语言·开发语言·c++·mfc·1024程序员节