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

news2024/11/26 1:38:48

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 0
        for i in range(k):
            maximum = max(piles)
            Max_index = piles.index(maximum)
            if piles[Max_index] % 2 == 0 :#如果当前值为偶数直接整除
                piles[Max_index] = piles[Max_index] // 2
            else :#如果当前值为偶数奇数则向下取整
                piles[Max_index] = piles[Max_index]//2 + 1
        print(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.coloradmin.cn/o/1332597.html

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

相关文章

Win11右键菜单显示全部的方法

Win11右键菜单显示全部的方法&#xff1a;1. 用鼠标右键点击“开始”按钮&#xff08;或者按WinX键&#xff09;&#xff0c;选择点击 “Windows 终端&#xff08;管理员&#xff09;”。 2.在终端应用程序里粘贴这串代码【reg.exe add “HKCU\Software\Classes\CLSID{86ca1aa…

实现一个最简单的内核

更好的阅读体验&#xff0c;请点击 YinKai s Blog | 实现一个最简单的内核。 ​ 这篇文章带大家实现一个最简单的操作系统内核—— Hello OS。 PC 机的引导流程 ​ 我们这里将借助 Ubuntu Linux 操纵系统上的 GRUB 引导程序来引导我们的 Hello OS。 ​ 首先我们得了解一下&a…

burpsuite与sqlmap联动(sqlipy配置)

首先我们需要在burpsuite的 扩展-选项 里配置两个路径&#xff1a; 第一个路径为 jython-standalone-2.7.3.jar 的路径 这个jar文件我们需要自己下载&#xff0c;下载地址&#xff1a;https://www.jython.org/ 点击 download 点击 Jython Standalone 下载好之后将这个jar文件…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

基于Python的音乐数据可视化与推荐系统开发

基于Python的音乐数据可视化与推荐系统开发 导言&#xff1a; 音乐是人们生活中不可或缺的一部分&#xff0c;而对于音乐数据的收集、分析和可视化正逐渐成为技术领域的热点。本文介绍了一款基于Python开发的音乐数据可视化与推荐系统&#xff0c;通过爬取千千音乐网站的数据&a…

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

双向A*算法-python

GitHub - LittleFox99/B_A_star: Bidirectional A Star 其中a&#xff0c;b分别为双向A*搜索的权重 #-*- coding:utf-8 -*- # Time : 2020/11/11 1:21 下午 # Author : LittleFox99 # File : a_star.py # 参考&#xff1a; # https://blog.csdn.net/lustyoung/article/d…

前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 单调双队列 贪心 题目 给你一个下标从 0 开始的整数数组 nums 。 你可以执行任意次操作。每次操作中&#xff0c;你需要选择一个 子数组 &#xff0c;并将这个子数组用它所…

资深13年测试整理,性能测试指标-评估方法,一篇搞懂...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件性能的关注…

深入探讨DNS数据包注入与DNS中毒攻击检测 (C/C++代码实现)

DNS数据包注入和DNS中毒攻击是网络安全领域中的两个重要主题。DNS&#xff08;域名系统&#xff09;是互联网中的一项核心服务&#xff0c;负责将域名转换为与之相对应的IP地址。 DNS数据包注入是指攻击者通过篡改或伪造DNS请求或响应数据包来干扰或破坏DNS服务的过程。攻击者…

webots仿真报警[ERROR] [1703399199.459991029]: Sampling period is not valid.

一、故障现象 在运行interace传感器使能程序时&#xff0c;报警[ERROR] [1703399199.459991029]: Sampling period is not valid. [ERROR] [1703399199.460080083]: Failed to enable lidar.并发生崩溃。 二、解决方式 1、尝试将程序中的TIME_STEP数值改为与WOrldInfo中的bas…

LeetCode 1954. 收集足够苹果的最小花园周长

一、题目 1、题目描述 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整数 need…

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记 Abstract 无人机在各种应用中得到了广泛使用&#xff0c;例如航拍和军事安全&#xff0c;这得益于它们与固定摄像机相比的高机动性和广阔视野。多无人机追踪系统可以通过从不同视角收集互补的…

红日靶场-2

目录 前言 外网渗透 外网渗透打点 1、arp探测 2、nmap探测 3、nikto探测 4、gobuster目录探测 WebLogic 10.3.6.0 1、版本信息 2、WeblogicScan扫描 3、漏洞利用 4、哥斯拉连接 内网渗透 MSF上线 1、反弹连接 2、内网扫描 3、frpc内网穿透 4、ms17-010 5、ge…

【测试开发】测试用例讲解

文章目录 目录 文章目录 前言 一、测试用例的基本要素 二、测试用例的设计方法 1.基于需求的设计方法 对日历根据web界面的功能布局分析出的功能框图如下&#xff1a; 继续举一个例子百度云盘非功能测试的案例&#xff1a; 2.等价类 3.边界值 5.正交表 6.场景设计法 7…

什么等等? I/O Wait ≠ I/O 瓶颈?

本文地址&#xff1a;什么等等&#xff1f; I/O Wait ≠ I/O 瓶颈&#xff1f; | 深入浅出 eBPF 1. I/O Wait 定义2. 测试验证3. 进一步明确磁盘吞吐和读写频繁进程4. 内核 CPU 统计实现分析5. 总结参考资料 1. I/O Wait 定义 I/O Wait 是针对单个 CPU 的性能指标&#xff0…

使用Python实现发送Email电子邮件【第19篇—python发邮件】

文章目录 &#x1f47d;使用Python实现发送Email电子邮件&#x1f3b6;实现原理&#x1f3c3;Python实现发送Email电子邮件-基础版&#x1f46b;实现源码&#x1f646;源码解析 &#x1f487;Python实现发送Email电子邮件-完善版&#x1f46b;实现源码&#x1f646;源码解析&am…

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

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

婚庆婚礼策划服务网站建设的效果如何

品牌效应越来越重要&#xff0c;婚庆行业在多年的发展下&#xff0c;部分区域内也跑出了头部品牌&#xff0c;连锁门店也开了很多家&#xff0c;无论新品牌还是老品牌在新的区域开店总归少不了线上线下的宣传&#xff0c;虽然几乎每个人都会接触婚庆服务&#xff0c;但因为市场…

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

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