移除石子使总数最小(LeetCode日记)

LeetCode-1962-移除石子使总数最小

题目信息:

给你一个整数数组 p i l e s piles piles ,数组 下标从 0 0 0 开始 ,其中 p i l e s [ i ] piles[i] piles[i] 表示第 i i i 堆石子中的石子数量。另给你一个整数 k k k ,请你执行下述操作 恰好 k k k 次:
选出任一石子堆 p i l e s [ i ] piles[i] piles[i] ,并从中 移除 f l o o r ( p i l e s [ i ] / 2 ) floor(piles[i] / 2) floor(piles[i]/2) 颗石子。
注意:你可以对 同一堆 石子多次执行此操作。
返回执行 k k k 次操作后,剩下石子的 最小 总数。
注: f l o o r ( x ) floor(x) floor(x) 为 小于 或 等于 x x x 的 最大 整数。(即,对 x x x 向下取整)。

  • 示例1:

输入: p i l e s = [ 5 , 4 , 9 ] , k = 2 piles = [5,4,9], k = 2 piles=[5,4,9],k=2
输出:12
解释:可能的执行情景如下:

  • 对第 2 堆石子执行移除操作,石子分布情况变成 [5,4,5] 。
  • 对第 0 堆石子执行移除操作,石子分布情况变成 [3,4,5] 。

剩下石子的总数为 12 。

  • 示例2:

输入: p i l e s = [ 4 , 3 , 6 , 7 ] , k = 3 piles = [4,3,6,7], k = 3 piles=[4,3,6,7],k=3
输出:12
解释:可能的执行情景如下:

  • 对第 2 堆石子执行移除操作,石子分布情况变成 [4,3,3,7] 。
  • 对第 3 堆石子执行移除操作,石子分布情况变成 [4,3,3,4] 。
  • 对第 0 堆石子执行移除操作,石子分布情况变成 [2,3,3,4] 。

剩下石子的总数为 12 。

提示:

  • 1 < = p i l e s . l e n g t h < = 1 0 5 1 <= piles.length <= 10^5 1<=piles.length<=105
  • 1 < = p i l e s [ i ] < = 1 0 4 1 <= piles[i] <= 10^4 1<=piles[i]<=104
  • 1 < = k < = 1 0 5 1 <= k <= 10^5 1<=k<=105

相关标签 :贪心,数组,堆(优先数列)

题解

方法1:贪心法(超时)

初见这道题,一阵开心,这不简单?在 k k k次循环中每次找到当前值最大的下标,对其进行 f l o o r ( x ) floor(x) floor(x)操做,丢掉 p i l e s [ m a x piles[max piles[max_ i n d e x ] index] index]整除 2 2 2 个石子。在完成循环后,得到的 p i l e s piles piles 数组的和即为我们在找的剩余石子的数量。

实现代码(Python)
class Solution:def minStoneSum(self, piles: List[int], k: int) -> int:if piles is None:return 0for i in range(k):maximum = max(piles)Max_index = piles.index(maximum)if piles[Max_index] % 2 == 0 :#如果当前值为偶数直接整除piles[Max_index] = piles[Max_index] // 2else :#如果当前值为偶数奇数则向下取整piles[Max_index] = piles[Max_index]//2 + 1print(piles)return sum(piles)

遗憾的是,并未通过全部的测试用例。定睛一看,本算法的时间复杂度为 O ( k ∗ l e n g t h ) O(k*length) O(klength) , 而 1 < = p i l e s . l e n g t h < = 1 0 5 1 <= piles.length <= 10^5 1<=piles.length<=105 1 < = k < = 1 0 5 1 <= k <= 10^5 1<=k<=105,则如果 k k k l e n g t h length length均取最大值的话,确实最终的计算次数是超出最大的计算能力的。唯有想办法优化。
在这里插入图片描述

方法2:贪心法+优先队列(大根堆)

首先介绍一下什么是优先队列:优先队列是一种抽象数据结构,在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构(大根堆)来实现。(不了解大根堆的朋友可以自行百度相关知识)
根据题目描述,为了使得剩下的石子总数最小,我们需要尽可能多地移除石子堆中的石子。因此,每次应该贪心地选择数量最多的石子堆进行移除。
我们创建一个优先队列(大根堆) h e a p heap heap ,用于存储石子堆的数量。初始时,将所有石子堆的数量加入优先队列。
接下来,我们进行 k k k 次操作。在每一次操作中,我们取出优先队列的堆顶元素 x x x,将 x x x 减半后重新加入优先队列。
在进行了 k k k 次操作后,优先队列中所有元素的和即为答案。

实现代码(Python)
class Solution:def minStoneSum(self, piles: List[int], k: int) -> int:heap = [-x for x in piles]heapify(heap)for _ in range(k):heapreplace(heap, heap[0] // 2)return -sum(heap)
复杂度分析:

因为大根堆的插入时间复杂度为 O ( l o g 2 n ) O(log_2 n) O(log2n),所以该算法总的复杂度为:

  • 时间复杂度 O ( n + k × l o g ⁡ 2 n ) O(n+k×log⁡_2 n) O(n+k×log2n)
  • 空间复杂度 O ( n ) O(n) O(n)

其中 n n n 是数组 p i l e s piles piles 的长度。

题记:


  • 研究生在读,我会尽量保持LeetCode每日一题的思路和代码输出。希望大家多多支持。
  • 水平有限,希望各位大佬能够批评指正。您的教诲是我进步的船帆。
  • 希望各位跟我一样的小白能跟我一起参与到做题和讨论中来。共同进步是我所能期盼的最高愿想。
  • 您的点赞和关注是我坚持分享的动力泉源,希望能将这件简单平凡的事一直做下去。感谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

运维大模型探索之 Text2PromQL 问答机器人

作者&#xff1a;陈昆仪&#xff08;图杨&#xff09; 大家下午好&#xff0c;我是来自阿里云可观测团队的算法工程师陈昆仪。今天分享的主题是“和我交谈并获得您想要的PromQL”。今天我跟大家分享在将AIGC技术运用到可观测领域的探索。 今天分享主要包括5个部分&#xff1a;…

【Python】基于flaskMVT架构与session实现博客前台登录登出功能

目录 一、MVT说明 1.Model层 2.View层 3.Template层 二、功能说明 三、代码框架展示 四、具体代码实现 models.py 登录界面前端代码 博客界面前端代码&#xff08;profile.html&#xff09; main.py 一、MVT说明 MVT架构是Model-View-Template的缩写&#xff0c;是…

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用&#xff08;FA模型&#xff09; 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

SpringBoot3-基础特性

文章目录 自定义 banner自定义 SpringApplicationFluentBuilder APIProfiles指定环境环境激活环境包含Profile 分组Profile 配置文件 外部化配置配置优先级 外部配置导入配置属性占位符 单元测试-JUnit5测试组件测试注解断言嵌套测试参数化测试 自定义 banner banner 就是启动…

计算机毕业设计 基于SpringBoot的房屋租赁管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发&#xff1a; https://www.cnblogs.com/yup1983/p/11337837.html 验证&#xff1a; 最近通过ESP8266远程控制小车&#xff0c;在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示&#xff0c;数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…

初识QT(上篇):What Qt

初识QT&#xff08;上篇&#xff09;&#xff1a;What Qt 前言 & 说明前言说明 初识QT1.1 QT的what1. 介绍2. 发展历程3. QT架构的主要内容4.QT的常用模块 1.2 QT的 why1. QT的核心机制 下篇笔记链接 前言 & 说明 前言 前言&#xff1a; 之前说要share的qt相关知识&am…

7种常见的网络安全设备及其功能

网络安全设备在现代网络环境中起着至关重要的作用&#xff0c;帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备&#xff0c;包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备&#xff0c;并详…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火&#xff0c;大多数技术组件都是运行在JVM上的&#xff0c;Flink也是运行在JVM上&#xff0c;基于JVM的数据分析引擎都需要将大量的数据存储在内存中&#xff0c;这就不得不面临JVM的一些问题&#xff0c;比如Ja…

Python算法例27 对称数

1. 问题描述 对称数是一个旋转180后&#xff08;倒过来&#xff09;看起来与原数相同的数&#xff0c;找到所有长度为n的对称数。 2. 问题示例 给出n2&#xff0c;返回[&#xff02;11&#xff02;&#xff0c;&#xff02;69&#xff02;&#xff0c;&#xff02;88&#x…

【JAVA】分布式链路追踪技术概论

目录 1.概述 2.基于日志的实现 2.1.实现思想 2.2.sleuth 2.2.可视化 3.基于agent的实现 4.联系作者 1.概述 当采用分布式架构后&#xff0c;一次请求会在多个服务之间流转&#xff0c;组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题&#xff1a;…

计算机网络 运输层下 | TCP概述 可靠传输 流量控制 拥塞控制 连接管理

文章目录 3 运输层主要协议 TCP 概述3.1 TCP概述 特点3.2 TCP连接RSVP资源预留协议 4 TCP可靠传输4.1 可靠传输工作原理4.1.1 停止等待协议4.1.2 连续ARQ协议 4.2 TCP可靠通信的具体实现4.2.1 以字节为单位的滑动窗口4.2.2 超时重传时间的选择4.2.3 选择确认SACK 5 TCP的流量控…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09; 在…

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体&#xff1a; ②使用matplotlib画图&#xff0c;中文字体显示不出来 【问题思考】 在网上搜了好多&#xff0c;关于使用python进行matplotlib画图字体显示不出来的&#xff0c;但是我试用了下&#xff0c;对我来说都没有。有些仅使用于windows系…

Netty-2-数据编解码

解析编解码支持的原理 以编码为例&#xff0c;要将对象序列化成字节流&#xff0c;你可以使用MessageToByteEncoder或MessageToMessageEncoder类。 这两个类都继承自ChannelOutboundHandlerAdapter适配器类&#xff0c;用于进行数据的转换。 其中&#xff0c;对于MessageToMe…

字符设备驱动开发-注册-设备文件创建

一、字符设备驱动 linux系统中一切皆文件 1、应用层&#xff1a; APP1 APP2 ... fd open("led驱动的文件"&#xff0c;O_RDWR); read(fd); write(); close(); 2、内核层&#xff1a; 对灯写一个驱动 led_driver.c driver_open(); driver_read(); driver_write(…

GoogLeNet(V1)

目录 一、GooLeNet介绍 1、模型设计的motivation 2、Inception块 3、GoogLeNet架构 4、Inception后续变种 5、总结 二、代码实现 1、Inception块 2、GoogLeNet模型 3、训练模型 4、总结 一、GooLeNet介绍 GoogLeNet是由Google团队于2014年提出的深度卷积神经网络架构…