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

2023-10-28 22:45
文章标签 数量 最多 礼物 2558 堆取

本文主要是介绍2558. 从数量最多的堆取走礼物,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


2558. 从数量最多的堆取走礼物
难度: 简单
来源: 每日一题 2023.10.28

给你一个整数数组 gifts ,表示各堆礼物的数量。每一秒,你需要执行以下操作:

  • 选择礼物数量最多的那一堆。
  • 如果不止一堆都符合礼物数量最多,从中选择任一堆即可。
  • 选中的那一堆留下平方根数量的礼物(向下取整),取走其他的礼物。

返回在 k 秒后剩下的礼物数量。

示例 1:

输入:gifts = [25,64,9,4,100], k = 4
输出:29
解释: 
按下述方式取走礼物:
- 在第一秒,选中最后一堆,剩下 10 个礼物。
- 接着第二秒选中第二堆礼物,剩下 8 个礼物。
- 然后选中第一堆礼物,剩下 5 个礼物。
- 最后,再次选中最后一堆礼物,剩下 3 个礼物。
最后剩下的礼物数量分别是 [5,8,9,4,3] ,所以,剩下礼物的总数量是 29 。

示例 2:

输入:gifts = [1,1,1,1], k = 4
输出:4
解释:
在本例中,不管选中哪一堆礼物,都必须剩下 1 个礼物。 
也就是说,你无法获取任一堆中的礼物。 
所以,剩下礼物的总数量是 4 。

提示:

  • 1 <= gifts.length <= 10^3
  • 1 <= gifts[i] <= 10^9
  • 1 <= k <= 10^3
class Solution {public long pickGifts(int[] gifts, int k) {}
}

分析与题解

  • 优先队列

    这个题目不说了, 做了三个月的题目之后就知道有优先队列这个概念, 直接上优先队列进行自动排序.

    PriorityQueue<Integer> queue = new PriorityQueue<Integer>((a, b) -> b - a);
    long result = 0;
    for(int gift: gifts) {queue.offer(gift);result += gift;
    }
    

    然后遍历 k 次, 每次都取优先队列中第一个数字, 平方根完成之后, 再次插入到优先队列中. 通过计算我们就能知道还拿走了多少, 通过总数减去拿走的礼物数量就是题目的题解了.

    for(int i = 0; i < k; i++) {Integer gift = queue.poll();double squareRoot = Math.sqrt(gift);int floorValue = (int) Math.floor(squareRoot);result -= (gift - floorValue);queue.offer(floorValue);
    }
    

    最后我们一起来看一下整体的解题方案, 代码如下所示.

    class Solution {public long pickGifts(int[] gifts, int k) {PriorityQueue<Integer> queue = new PriorityQueue<Integer>((a, b) -> b - a);long result = 0;for(int gift: gifts) {queue.offer(gift);result += gift;}for(int i = 0; i < k; i++) {Integer gift = queue.poll();double squareRoot = Math.sqrt(gift);int floorValue = (int) Math.floor(squareRoot);result -= (gift - floorValue);queue.offer(floorValue);}return result;}
    }
    

    复杂度分析:

    • 时间复杂度: O(klogn), 优先队列每次添加元素的时间复杂度是logn, k 次往优先队列中添加元素
    • 空间复杂度: O(n). 优先队列的空间复杂度与 gifts 数组的长度成线性关系.

    结果如下所示.

这篇关于2558. 从数量最多的堆取走礼物的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296470

相关文章

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

一个统计文件中关键词数量的小程序-优化版本

public class computeWxxFileNum{public static void main(String[] args) throws IOException {//读文件File sourceFile = new File("e:\\55-tmp\\xxx.log");FileReader in = new FileReader(sourceFile); LineNumber

一个统计文件中关键词数量的小程序

public class computeFileNum{public static void main(String[] args) throws IOException {File sourceFile = new File("e:\\55-tmp\\xxx.log"); FileReader in = new FileReader(sourceFile); LineNumberReader

pytorch计算网络参数量和Flops

from torchsummary import summarysummary(net, input_size=(3, 256, 256), batch_size=-1) 输出的参数是除以一百万(/1000000)M, from fvcore.nn import FlopCountAnalysisinputs = torch.randn(1, 3, 256, 256).cuda()fl

Leetcode3258. 统计满足 K 约束的子字符串数量 I

Every day a Leetcode 题目来源:3258. 统计满足 K 约束的子字符串数量 I 解法1:暴力 暴力枚举每一个子字符串,看是否满足 k 约束。 代码: /** @lc app=leetcode.cn id=3258 lang=cpp** [3258] 统计满足 K 约束的子字符串数量 I*/// @lc code=startclass Solution{publ

报错处理:超过Uobject最大数量

处理方式 一、打包时项目中设置游戏中UObject的最大数量为100000000 二、打包后的配置文件中设置 打包路径: 一厅统管\Windows\YZ_YTTG\Saved\Config\Windows\Engine.ini文件下添加配置文件 [/Script/Engine.GarbageCollectionSettings] gc.MaxObjectsInEditor=100000000

数字化变革驱动珠江电缆产品质量与数量双提升

在全球化与科技迅猛发展的今天,传统制造业面临前所未有的挑战和机遇。 珠江电缆引入先进的生产管理系统,通过数字化手段优化生产流程。从原材料采购、生产计划到成品检验,每个环节都实现了信息化和数据化。这不仅减少了人为误差,还大大提升了生产效率,使得产品数量在短时间内得到了显著增加。 为了确保产品质量的稳定和提升,珠江电缆积极引进智能制造技术。通过自动化生产线和智能检测设备的应用,企业能够实时

讯飞医疗持续亏损:客户数量有所波动,应收账款账龄较长

《港湾商业观察》黄懿 近期,讯飞医疗科技股份有限公司(简称"讯飞医疗")再度递表港交所并更新招股书,华泰国际、广发融资(香港)及建银国际担任联席保荐人。 讯飞医疗为了此番递表,母公司与其做了十足的准备,那么最新更新的招股书又如何为其资本化道路加持呢?​ 持续亏损,业务结构出现变化 7月26日,科大讯飞(002230.SZ)发布公告称,控股子公司讯飞医疗收到中国证券监督管理委员会出具

Bagging: 数量,而不是质量。

由 AI 生成:过度简化的树、引导聚合、集成方法、弱学习器、减少方差 集成方法 — 数量,而不是质量 一、说明         机器学习中的集成方法是指组合多个模型以提高预测性能的技术。集成方法背后的基本思想是聚合多个基础模型(通常称为弱学习器)的预测,以生成通常比任何单个模型更准确、更稳健的最终预测。一般而言,我们通常遵循质量胜于数量的原则。然而,在这种情况下,事实证