【每日一题】从数量最多的堆取走礼物

news2024/11/15 12:51:54

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:排序
    • 方法二:优先队列
  • 其他语言
    • python3
  • 写在最后

Tag

【优先队列】【排序】【数组】【2023-10-28】


题目来源

2558. 从数量最多的堆取走礼物


题目解读

执行 k 次操作,每次从数量最多的堆中取走礼物。


解题思路

每次要从礼物数量最多的堆中取走一定的礼物,在没学过 优先队列 这种数据结构之前,可以使用 排序 来完成每次都从礼物数量最多的堆中取走一定的礼物。

方法一将会介绍排序的方,方法二介绍优先队列的方法。

方法一:排序

先对礼物数组进行升序排序,数组中最后一个元素就是最大的礼物数,将其值更新为平方根值。对以上操作执行 k 次,最后数组中所有礼物数量之和就是我们要返回的答案。

实现代码

class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        int n = gifts.size();
        while (k--) {
            sort(gifts.begin(), gifts.end());
            gifts[n-1] = sqrt(gifts[n-1]);
        }
        long long res = accumulate(gifts.begin(), gifts.end(), 0ll);
        return res;
    }
};

复杂度分析

时间复杂度: O ( k ⋅ n l o g n ) O(k \cdot nlogn) O(knlogn) k k k 为执行的时间, n n n 为数组 gifts 的长度。

空间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

方法二:优先队列

我们使用大顶堆来维护各堆中礼物的数量,进行 k 次如下的操作:每次从左取出最大的一个,求平方根之后将结果放入堆中。最后,大顶堆中所有礼物数量之和就是我们要返回的答案。

实现代码

class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        priority_queue<int> pq(gifts.begin(), gifts.end());
        while (k--) {
            int maxGift = pq.top();
            pq.pop();
            pq.push(sqrt(maxGift));
        }

        long long res = 0;
        while (!pq.empty()) {
            res += pq.top();
            pq.pop();
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 为数组 gifts 的长度。

空间复杂度: O ( l o g n ) O(logn) O(logn)


其他语言

python3

这里只给出 python3 的示例代码。

class Solution:
    def pickGifts(self, gifts: List[int], k: int) -> int:
        pq = [-gift for gift in gifts]
        heapify(pq)
        while k:
            x = heappop(pq)
            heappush(pq, -int(sqrt(-x)))
            k -= 1
        return -sum(pq)

在 python3 中,我们引入 heap 模块来构建优先队列,通过 heapify 构建最小堆,因为我们希望使用最大堆,所以将礼物数量取负数放入堆中。


写在最后

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VirtualBox 安装 麒麟Linux

为了验证Oracle EM是否可以管理麒麟OS和其上的Oracle数据库&#xff0c;今天试着在VirtualBox上装了麒麟Linux&#xff0c;也就是银河麒麟。整个过程比较顺畅。 选定ISO文件后&#xff0c;操作系统自动识别为Red Hat。勾选“跳过自动安装”&#xff1a; 内存和CPU选的默认值&…

AFsim 仿真运行

创建完仿真模型平台后&#xff0c;点击Warlock.exe程序&#xff0c;弹出仿真运行的窗口&#xff0c;点击浏览选择创建好的test文件&#xff0c;点击运行。 点击运行后&#xff0c;进入仿真运行的主页面&#xff0c;如下图所示&#xff1a; 1.仿真控制 顶部工具栏中文件的内容。…

【C++】mapset的底层结构 -- AVL树(高度平衡二叉搜索树)

前面我们对 map / multimap / set / multiset 进行了简单的介绍&#xff0c;可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的。 但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索…

数据结构 | 算法的时间复杂度和空间复杂度【详解】

数据结构 | 算法的时间复杂度和空间复杂度【详解】 1. 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法&#xff1f; 算法(Algorithm):就是定义良好的计算过…

C++前缀和算法的应用:预算内的最多机器人数目

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 单调双向队列 滑动窗口 题目 你有 n 个机器人&#xff0c;给你两个下标从 0 开始的整数数组 chargeTimes 和 runningCosts &#xff0c;两者长度都为 n 。第 i 个机器…

Maven - no main manifest attribute(SpringBoot 多模块)

问题描述 no main manifest attribute 解决方案 一个主项目下&#xff0c;多个业务模块&#xff0c;假设 starter 模块作为启动器&#xff0c;以及主项目&#xff08;project&#xff09;最外层父 pom.xml 最关键要关注这 2 个 pom.xml&#xff08;starter - pom.xml & p…

python画气泡标尺图

目录 渐变气泡图彩色气泡图 在进行实验结果分析的时候&#xff0c;气泡标尺图能非常清晰对不同的结果进行多维度的比较&#xff0c;特别是在深度学习模型大小和精度进行比较的时候非常合适使用&#xff0c;以下是几个例子。 渐变气泡图 import seaborn as sns import matplotl…

正点原子嵌入式linux驱动开发——Linux 串口RS232/485/GPS 驱动

串口是很常用的一个外设&#xff0c;在Linux下通常通过串口和其他设备或传感器进行通信&#xff0c;根据 电平的不同&#xff0c;串口分为TTL和RS232。不管是什么样的接口电平&#xff0c;其驱动程序都是一样的&#xff0c;通过外接RS485这样的芯片就可以将串口转换为RS485信号…

RZMO-A-030/210、HZMO-A-030/315电控比例压力阀控制器

RZMO-A-030/50、RZMO-A-030/210、RZMO-A-030/350、RZMO-A-030/100、RZMO-A-030/315、HZMO-A-030/50、HZMO-A-030/210、HZMO-A-030/350、HZMO-A-030/100、HZMO-A-030/315滑阀型先导式数字型比例溢流阀&#xff0c;用于压力开环控制&#xff0c;可提供板式或叠加式安装。A型&…

web - 前段三剑客

目录 前言 一. HTML 常用标签演示 图片标签 ​编辑 表格标签(重点) ​编辑 表单标签 (重点) 布局标签 其余标签 二. CSS 2.1 . css的三种引入方式 2.2 . 三大选择器 2.3 . css样式 - 浮动 2.4 . css样式 - 定位 1.static 2.absolute(绝对位置) 3.relavite(相…

Binder机制总结笔记

Binder机制总结笔记 什么是Binder&#xff1f; Binder的Android特有的IPC通信机制。Android的四大组件Activity、Service、Broadcast、ContentProvider&#xff0c;不同的App等都运行在不同的进程内&#xff0c;他们之间的通信都需要依靠Binder完成。因此Binder在整个Android系…

好用的ps滤镜插件Portraiture2024

Photoshop 是最常用到的综合性的设计工具&#xff0c;虽然PS一直在迭代升级&#xff0c;但是在细节功能上&#xff0c;PS总是无法完全满足全部所有的用户需求&#xff0c;今天coco玛奇朵推荐一个个截至目前最受欢迎的免费的PS插件&#xff0c;有了这些功能扩展的插件后PS如虎添…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

拓世大模型 | 立足行业所需,发力终端,缔造智能无限可能

蒸汽机的发明为人类工业革命揭开序幕&#xff0c;引领了近现代产业变革。众所周知&#xff0c;而今AI技术的革命性突破&#xff0c;站在了时代舞台的中心&#xff0c;特别是大模型的崛起&#xff0c;无疑是第四次产业革命的焦点&#xff0c;它的地位可与当年的“蒸汽机”相提并…

AndroidSDK下载及安装(Windows)

下载地址&#xff1a;https://www.androiddevtools.cn/ 找到SDK工具并下载安装 都是傻瓜式一键安装 除了注意安装路径应避免选择中文或特殊字符路径&#xff0c;应该没什么大问题。 下载安装Android SDK Android SDK Tools安装后&#xff0c;启动SDK Manager.exe&#xff1a;…

综合OA管理系统源码 OA系统源码

综合OA管理系统源码 OA系统源码 功能介绍&#xff1a; 编号&#xff1a;LQ10 一&#xff1a;系统管理 系统配置&#xff0c;功能模块&#xff0c;功能节点&#xff0c;权限角色&#xff0c;操作日志&#xff0c;备份数据&#xff0c;还原数据 二&#xff1a;基础数据 审批…

Linux-组管理和权限管理

一、组管理—基本介绍 在linux中的每个用户必须属于一个组&#xff0c;不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。 1)所有者 2)所在组 3)其它组 4)改变用户所在的组 二、组管理—文件/目录所有者 1、查看文件或者目录的所有者和所在组的指令 所有…

文件加密,数据防泄密软件

文件加密和数据防泄密软件成为了保护信息安全的重要工具&#xff0c;它们可以有效地防止敏感数据的泄露和非法访问。 发展历史 文件加密和数据防泄密软件的发展历程可以追溯到上世纪90年代&#xff0c;当时随着互联网的普及和信息技术的不断发展&#xff0c;人们开始意识到信息…

考虑温度影响的vumat子程序在木材受火后强度分析中的应用

木结构在火灾作用下&#xff0c;木材的化学成分及物理特性会发生复杂的变化&#xff0c;导致其力学性能的改变&#xff0c;木构件承载能力降低。本文编写了考虑温度影响的木材本构vumat子程序&#xff0c;并对子程序的正确性进行了验证。 木材是一种复杂的各向异性复合材料&am…

JavaScript综合案例五

目录 一、实战案例&#xff1a;轮播图案例-完整版 代码实现 二、实战案例&#xff1a;tab栏切换 1.普通版本 代码实现 2.事件委托版本 代码实现 三、实战案例&#xff1a;表单全选反选 代码实现 四、实战案例&#xff1a;哔哩哔哩导航滑动 代码实现 五、实战案例&am…