【每日一题】执行 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

写在最后

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

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

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

相关推荐
.格子衫.1 小时前
真题卷001——算法备赛
算法
XiaoyaoCarter1 小时前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
galaxy_strive1 小时前
qtc++ qdebug日志生成
开发语言·c++·qt
Hygge-star1 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
Darkwanderor2 小时前
c++STL-list的模拟实现
c++·list
Humbunklung2 小时前
Visual Studio 2022 中添加“高级保存选项”及解决编码问题
前端·c++·webview·visual studio
小乌龟不会飞2 小时前
gflags 安装及使用
c++·mfc·gflags 库
June`3 小时前
专题二:二叉树的深度搜索(二叉树剪枝)
c++·算法·深度优先·剪枝
AI+程序员在路上4 小时前
XML介绍及常用c及c++库
xml·c语言·c++
好吃的肘子4 小时前
Elasticsearch架构原理
开发语言·算法·elasticsearch·架构·jenkins