移除石子使总数最小(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.mzph.cn/news/241826.shtml

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

相关文章

Django开发2

Django开发2 Django开发1.新建项目2.创建app3.设计表结构&#xff08;django&#xff09;4.在MySQL中生成表5.静态文件管理6.部门管理7.模板的继承8.用户管理8.1 初识Form1. views.py2.user_add.html 8.3 ModelForm&#xff08;推荐&#xff09;0. models.py1. views.py2.user_…

机器人创新实验室任务三参考文档

一、JAVA环境配置 需要在Linux里面下载并且安装java。 sudo apt-get install openjdk-17-jre-headless 打开终端并且运行指令&#xff0c;用apt下载安装java。官方用的好像是java11&#xff0c;我安装的是java17。 如果无法定位软件安装包&#xff0c;可以试试更新一下 sudo …

直接插入排序【从0-1学数据结构】

文章目录 &#x1f497; 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

统计和绘图软件GraphPad Prism mac功能特点

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松…

大白鲨生成Windows木马(仅供参考不可实践)

一、学习方法 一个正确的学习方法往往比学习更为重要 方法一&#xff1a;学习技术的本质性作用 &#xff08;第一性定律&#xff09; — 帮助我们解决的问题是什么 — 产生的原因/价值 方法二&#xff1a;在工作中到底如何使用&#xff1f; 方法三&#xff1a;技术是由人…

【pynput】鼠标行为追踪并模拟

文章目录 前言基本思路安装依赖包实时鼠标捕获捕获鼠标位置捕获鼠标事件记录点击内容 效果图 利用本文内容从事的任何犯法行为和开发与本人无关&#xff0c;请理性利用技术服务大家&#xff0c;创建美好和谐的社会&#xff0c;让人们生活从繁琐中变得更加具有创造性&#xff01…

JavaScript状态模式

JavaScript状态模式 1 什么是状态模式2 使用状态模式改造电灯程序3 缺少抽象类的变通方式4 示例&#xff1a;文件上传4.1 场景描述4.2 代码过程 1 什么是状态模式 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 比如说这样一个场景&a…

【贪心】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法应用示例时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E)&#xff0c;其中每条边的权是非负实数&#xff0c;给定 V V V中的一个…

指南:在App Store Connect上编辑多个用户的访问权限

作为一名编程新手&#xff0c;在App Store Connect中管理用户权限可能初听起来有些复杂&#xff0c;但实际上它是一个相对直接的过程。这里是一个步骤清晰的指南来帮助您在App Store Connect上编辑多个用户的访问权限。 App Store Connect 简介 在开始之前&#xff0c;让我们…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决&#xff0c;完全取代路由器。 使用 倍控的 N5105 设备&#xff0c;有 mPCIe 接口&#xff0c;使用了 intel AX200 无线网卡&#xff0c;支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi&#xff0c;在…

“抓取再吸取的连续操作学习”研究工作发表于IEEE Trans. on Robotics:仿人手的柔性抓取,超人手的指背吸取!

长期以来&#xff0c;抓取一直被认为是机器人操作中一项重要而实际的任务。然而&#xff0c;实现对不同物体的稳健和有效的抓取具有挑战性&#xff0c;因为它涉及夹具设计、感知、控制和学习等。最近基于学习的方法在抓取各种新物体方面表现出优异的性能。然而&#xff0c;这些…

【C++11特性篇】新的类功能解读:新增加的[移动构造函数/移动赋值运算符重载]

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 &#xff08;一&#xff09;” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

Github 2023-12-24 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-24统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5Jupyter Notebook项目2C项目1C项目1Go项目1Java项目1JavaScript项目1Ruby项目1 Serverless Frame…

双向长短期记忆网络(Bi-LSTM)-多输入回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编…

vscode配置用户代码片段

1.左下角打开设置 2.新建全局代码片段 3.输入名字&#xff0c;名字随意不过最好语意化 4.创建模版 这里的模版为vue2常用代码片段&#xff0c;稍后会持续更新。 {"Print to console": {"prefix": "v2", //页面使用时名称"body":…

LeNet网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 网络分析&#xff1a; 最好是把这个图像和代码对着来看然后进行分析的时候比较快 # 使用torch.nn包来构建神经网络. im…

Go 泛型之类型参数

Go 泛型之类型参数 文章目录 Go 泛型之类型参数一、Go 的泛型与其他主流编程语言的泛型差异二、返回切片中值最大的元素三、类型参数&#xff08;type parameters&#xff09;四、泛型函数3.1 泛型函数的结构3.2 调用泛型函数3.3 泛型函数实例化&#xff08;instantiation&…

WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER.

Hadoop启动时警告&#xff0c;但不影响使用&#xff0c;强迫症的我还是决定寻找解决办法 WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.原因是Hadoop安装配置于root用户下&#xff0c;对文件需要进…

案例144:基于微信小程序的自修室预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…