【Leetcode】【每日一题】【简单】2558. 从数量最多的堆取走礼物

news2024/9/24 4:32:57

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/take-gifts-from-the-richest-pile/description/?envType=daily-question&envId=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排序,给最后一个元素,即最大的元素开平方。循环4次。 

代码 

class Solution {
    public long pickGifts(int[] gifts, int k) {
        int len = gifts.length;
        for (int i = 0; i < k; i++) {
            Arrays.sort(gifts);
            gifts[len - 1] = (int) Math.sqrt(gifts[len -1]);
        }

        long res = 0;
        for (int i = 0; i < len; i++) {
            res += gifts[i];
        }

        return res;
    }
}

力扣官方题解

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/take-gifts-from-the-richest-pile/solutions/2477680/cong-shu-liang-zui-duo-de-dui-qu-zou-li-kt246/

 

最大堆

思想感觉和我的差不多,不同的是它使用了一个优先队列(PriorityQueue) pq,并且使用了一个自定义的比较器,将较大的礼物排在前面。而我每次都需要重新排序。

比较器

定义是在创建优先队列时传入的参数,也就是在创建 PriorityQueue<Integer> 对象时,通过 lambda 表达式来定义的比较器。

在这段代码中,比较器的定义使用了箭头函数 (a, b) -> b - a。箭头函数的左边是输入参数,即要比较的两个整数 a 和 b;箭头函数的右边是返回值,即要比较的结果。既然返回值是 a - b,那么比较器的规则就是按照从大到小的顺序对整数进行排序。

具体来说,当 a > b 时,a - b 的值为正数,返回值为正数,表示 a 在 b 的前面;当 a = b 时,a - b 的值为零,返回值为零,表示 a 和 b 相等,顺序不变;当 a < b 时,a - b 的值为负数,返回值为负数,表示 a 在 b 的后面。

因此,通过定义这个自定义的比较器,代码创建的优先队列 pq 会按照从大到小的顺序存储礼物的价值。这样,在每次取出最大值和加入平方根后的操作中,总是可以保证 pq 中的最大值是当前最有价值的礼物。

代码

class Solution {
    public long pickGifts(int[] gifts, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);
        for (int gift : gifts) {
            pq.offer(gift);
        }
        while (k > 0) {
            k--;
            int x = pq.poll();
            pq.offer((int) Math.sqrt(x));
        }
        long res = 0;
        while (!pq.isEmpty()) {
            res += pq.poll();
        }
        return res;
    }
}

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

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

相关文章

NodeJS爬取墨刀上的设计图片

背景 设计人员分享了一个墨刀的原型图&#xff0c;但是给的是只读权限&#xff0c;无法下载其中的素材&#xff1b;开发时想下载里面的一张动图&#xff0c;通过浏览器的F12工具在页面结构找到了图片地址。 但是浏览器直接访问后发现没权限&#xff1a; Nginx 的 403 页面。。…

VistaSoftware.vTask Studio 7.913 Crack

VistaTask 是一款支持包括互联网活动&#xff0c;数据库查询&#xff0c;文件操作&#xff0c;窗口控制&#xff0c;鼠标活动&#xff0c;键盘输入以及其它活动在内的160多种不同活动的全功能自动控制工具。你可以通过简单的拖拽想要的活动的方式来指定新的自动控制任务&#x…

HDFS 短路读的实现(全网最全面深入讲解)

文章目录 前言1. 知识准备1.1 关于域套接字(Domain Socket)什么是Domain SocketDomain Socket 通信在ShortCircuit Read中做了什么DomainSocket 在Hadoop上的基本实现 1.2 关于内存映射(MMAP)什么是MMAPMMAP在ShortCircuit中的作用是什么 1.3 关于共享内存(Shared Memory)什么是…

USB学习(3):USB描述符和USB类设备

文章目录 1 USB描述符(Descriptors)1.1 设备描述符(Device Descriptor)1.2 配置描述符(Configuration Descriptor)1.3 接口关联描述符(Interface Association Descriptor)1.4 接口描述符(Interface Descriptor)1.5 端点描述符(Endpoint Descriptor)1.6 字符串描述符(String Des…

CS224W2.1——传统基于特征的方法(节点层级特征)

CS224W1.1——图机器学习介绍CS224W1.2——图机器学习应用CS224W1.3——图表示的选择 前面几篇介绍了图机器学习的基础一些背景知识&#xff0c;我们知道图机器学习任务分为多个层级&#xff1a; 节点层级任务边层级任务子图层级任务图层级任务 这篇主要讲传统的基于特征方法…

基于MFC的串口通信

1、串口通信的概述&#xff1a; 串口是一种重要的通信资源&#xff0c;例如鼠标口、USB接口都是串口。串行端口是CPU和串行设备间的编码转换器。当数据从CPU经过端口发送出去的时候&#xff0c;字节数据会被转为串行的位&#xff0c;在接收数据时&#xff0c;串行的位被转换为…

无线WIFI接入FreeRadius进行认证——筑梦之路

环境说明 硬件设备&#xff1a; ASUS RT-AC88U路由器 服务器系统&#xff1a;Ubuntu 16.04 软件版本&#xff1a;FreeRADIUS 2.2.8 服务安装搭建 1. 安装freeradius apt-get install freeradius freeradius-mysql 2. 配置用户 vim /etc/freeradius/userssteve Cleart…

数据结构绪论,基本概念

目录 1.什么是数据结构&#xff1f; 2.三种数据结构&#xff1a; 3.第一章绪论 了解概念 1.几个概念 2.数据存储方式&#xff1a; 3.算法的五个重要特性: 4.算法设计的要求: 1.什么是数据结构&#xff1f; 数据 数据&#xff0c;是对客观事物的符号表示&#xff0c;在计…

操作系统——内存扩容:覆盖技术、交换技术(王道视频p44)

1.对于覆盖技术 和 交换技术&#xff1a;&#xff08;并不是重点&#xff09;

LaTeX:在标题section中添加脚注footnote

命令讲解 先导包&#xff1a; \usepackage{footmisc} 设原标题为&#xff1a; \section{标题内容} 更改为&#xff1a; \section[标题内容]{标题内容\protect\footnote{脚注内容}} 语法讲解&#xff1a; \section[]{} []内为短标题&#xff0c;作为目录和页眉中的标题。…

redis6.0源码分析:字典扩容与渐进式rehash

文章目录 字典数据结构结构设计dictType字典类型为什么字典有两个哈希表&#xff1f;哈希算法 扩容机制扩容前置知识字典存在几种状态&#xff1f;容量相关的关键字段定义字典的容量都是2的幂次方 扩容机制字典什么时候会扩容&#xff1f;扩容的阈值 & 扩容的倍数哪些方法会…

Android平台GB28181执法记录仪技术方案

技术背景 我们在做Android平台GB28181设备接入模块的时候&#xff0c;对接过好多开发者&#xff0c;他们都是用于执法记录仪场景&#xff0c;执法记录仪是一种便携式设备&#xff0c;用于记录执法人员的行动和接触情况&#xff0c;通过实时回传音视频数据和实时位置信息给指挥…

2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码

2023妈妈杯数学建模B题完整版思路、模型代码已出&#xff01;&#xff01;&#xff01; 云顶数模最新完整版解题思路、模型代码&#xff0c;供大家参考~~ B题目 解题思路 详细模型解析&#xff1a;

RGB-T Salient Object Detection via Fusing Multi-Level CNN Features

ADFC means ‘adjacent-depth feature combination’&#xff0c;MGF means ‘multi-branch group fusion’&#xff0c;JCSA means ‘joint channel-spatial attention’&#xff0c;JABMP means ‘joint attention guided bi-directional message passing’ 作者未提供代…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

JVM虚拟机:运行时数据区详解

本文重点 我们前面已经将类的加载过程进行了全面的了解和学习,按照如下所示的JVM架架构图,接下来我们应该学习运行时数据区了。 运行时数据区 如上图所示,灰色的标识线程私有,基本不存在垃圾回收。而非灰色的是线程共享的,存在垃圾回收。 PC计数器 每个线程都有一个程序…

【java】建筑施工一体化智慧工地信息管理系统源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

简化geojson策略

1、删除无用的属性&#xff0c;也就是字段&#xff0c;在shp的时候就给删了 用arcgis等等软件都可以做到 2、简化坐标的小数位数 &#xff08;1&#xff09;网上推荐的办法&#xff0c;俺不会Python… github.com/perrygeo/geojson-precision &#xff08;2&#xff09;曲线…

【C++项目】高并发内存池第五讲内存回收释放过程介绍

内存回收 1.ThreadCache2.CentralCache3.PageCache 1.ThreadCache void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size < MAX_BYTES);//计算在哪号桶中&#xff0c;然后插入进去size_t index SizeClass::Index(size);_freeLists[index].Push…

HCIP笔记——数据链路层协议

网络类型 根据二层&#xff08;数据链路层&#xff09;所使用的协议来进行区分。 MA——多点接入网络 BMA——广播型多点接入网络——以太网 NBMA——非广播型多点接入网络 P2P——点到点的网络 以太网协议 MAC地址——区分和标识不同的设备 以太网中独有的一种地址——MAC地址…