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

news/2024/5/20 9:54:40 标签: leetcode, 算法, 题解, , 优先队列

【LetMeFly】2558.从数量最多的取走礼物

力扣题目链接:https://leetcode.cn/problems/take-gifts-from-the-richest-pile/

给你一个整数数组 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 <= 103
  • 1 <= gifts[i] <= 109
  • 1 <= k <= 103

方法一:优先队列(大根

首先将gifts数组变成大根(或者优先队列),然后在接下来的 n n n次操作中,每次取出顶的一个元素,并将这个元素( t t t)的 ⌊ t ⌋ \lfloor \sqrt{t} \rfloor t 加入栈中。

k k k次操作后,返回/数组中元素之和即可。

  • 时间复杂度 O ( n + k log ⁡ n ) O(n + k \log n) O(n+klogn)
  • 空间复杂度 O ( 1 ) O(1) O(1)。这里直接在 g i f t s gifts gifts数组上建了,没有使用过多的额外空间

AC代码

C++
class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        make_heap(gifts.begin(), gifts.end());
        while (k--) {
            pop_heap(gifts.begin(), gifts.end());  // 弹出顶并一到数组末尾
            gifts.back() = sqrt(gifts.back());
            push_heap(gifts.begin(), gifts.end());
        }
        return accumulate(gifts.begin(), gifts.end(), 0LL);
    }
};
Python
from typing import List
from math import sqrt
import heapq

class Solution:
    def pickGifts(self, gifts: List[int], k: int) -> int:
        for i in range(len(gifts)):
            gifts[i] = -gifts[i]
        heapq.heapify(gifts)
        for _ in range(k):
            thisGift = heapq.heappop(gifts)
            heapq.heappush(gifts, -int(sqrt(-thisGift)))
        return -sum(gifts)

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134088006


http://www.niftyadmin.cn/n/5129575.html

相关文章

OpenGLSurfaceView的使用经验

OpenGLSurfaceView的使用经验 openGLSurfaceView创建的时候调用setRenderer把自己构造的OpenGLSurfaceRender设置进去。只能调用一次&#xff0c;限制一个GLThread负责一个 渲染的业务。同时设置创建一个环境变量&#xff0c; OpenGL ES 2.0&#xff1b;再设置render的模式&am…

Redis学习笔记3:基于springboot的lettuce redis客户端validateConnection连接有效性检查

LettuceConnectionFactory连接工厂默认对redis操作时不会对本地共享连接进行有效性检测&#xff0c;不进行有效性检测可以 提升应用程序的性能&#xff0c;但是也会带来一定的连接无效性的风险&#xff0c;LettuceConnectionFactory提供了一个validateConnection属性&#xff0…

vue2组件库-上传组件

vue2组件库 上传组件 核心思路&#xff1a;监控整个上传的流程 上传成功 上传失败 类型&#xff1a;拖拽 多个文件上传 上传必备属性 & 钩子属性 跟上传强关联的属性&#xff0c;上传必备的字段 name: 提交的那个formData字段名 action&#xff1a;ajax接口路径 limit&…

中文分词库-jieba

问题1&#xff1a;&#xff08;8分&#xff09;用 jieba 分词&#xff0c;计算字符串 s 中的中文词汇个数&#xff0c;不包括中文标点符号。显示输出分词后的结果&#xff0c;用”/ ”分隔&#xff0c;以及中文词汇个数。示例如下&#xff1a; 输入&#xff1a; 工业互联网”…

MATLAB中polyvalm函数用法

目录 语法 说明 示例 特征多项式的矩阵计算 polyvalm函数的功能是矩阵多项式计算。 语法 Y polyvalm(p,X) 说明 Y polyvalm(p,X) 以矩阵方式返回多项式 p 的计算值。此计算方式等同于使用多项式 p 替换矩阵 X。 示例 特征多项式的矩阵计算 求解 4 阶帕斯卡矩阵的特征…

python:多波段遥感影像分离成单波段影像

作者:CSDN @ _养乐多_ 在遥感图像处理中,我们经常需要将多波段遥感影像拆分成多个单波段图像,以便进行各种分析和后续处理。本篇博客将介绍一个用Python编写的程序,该程序可以读取多波段遥感影像,将其拆分为单波段图像,并保存为单独的文件。本程序使用GDAL库来处理遥感影…

黔院长 | 黄帝内经:人有四经十二从!

"人有四经十二从"这句话出自《黄帝内经素问》&#xff0c;“四经”指的是与四时相应的正常脉象&#xff0c;也是指四个主要经络&#xff1a;太阳经、少阳经、太阴经和少阴经。在中医理论当中这些经络被认为是人体气血运行的通道。 而“十二从”则表示人体的十二个经脉…

黑五网一来袭,卖家该如何做好旺季备货

亚马逊Prime Day大促刚刚完美落幕&#xff0c;黑五网一又将接着热度浪潮来袭&#xff0c;对于亚马逊卖家来说&#xff0c;黑五、网一是一年中非常重要的一个营销节点&#xff0c;是能让店铺销售量提升一个阶梯的重要机会。 在去年&#xff0c;美国消费者在黑五期间的消费额达到…