【Py/Java/C++三种语言详解】LeetCode每日一题240206【反悔性贪心+堆】LCP30、魔塔游戏

有华为OD考试扣扣交流群可加:948025485
可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1336了解算法冲刺训练

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目链接

LCP30、魔塔游戏

题目描述

小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0 表示房间对血量无影响。

小扣初始血量为 1,且无上限。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。请返回小扣最少需要调整几次,才能顺利访问所有房间。若调整顺序也无法访问完全部房间,请返回 -1。

示例 1:

输入:nums = [100,100,100,-250,-60,-140,-50,-50,100,150]

输出:1

解释:初始血量为 1。至少需要将 nums[3] 调整至访问顺序末尾以满足要求。

示例 2:

输入:nums = [-200,-300,400,0]

输出:-1

解释:调整访问顺序也无法完成全部房间的访问。

提示:

  • 1 <= nums.length <= 10^5
  • -10^5 <= nums[i] <= 10^5

解题思路

非常有意思的题目。

考虑人脑在处理这个问题的时候是如何做的。

假设我们正常地从头到尾遍历整个数组nums中的元素num,维护变量cur用于表示进入每一个房间之后的剩余血量。

当发现cur的血量降到小于等于0的时候,我们会想,如果在之前到达某个扣血扣得最多(绝对值最大的负数)的房间之前就事先把这个房间移动到末尾那就好了

换句话说,当血量小于等于0的时候,我们希望撤销之前扣得最多的那次扣血,使得我们现在的血量越高越高。

这就组成了一种带有反悔性质的贪心策略

那么应该如何找到在此之前扣血最多的那个房间呢?很容易想到用优先队列来维护这个过程。答案就呼之欲出了。

代码

Python

from heapq import heappop, heappush# 贪心+优先队列:O(nlogn)
class Solution:def magicTower(self, nums: List[int]) -> int:ans = 0cur = 1# 优先队列储存已经访问过的负数visited = list()# 移动到末尾的负数的和remove_total = 0# 遍历所有数字for num in nums:# 将该数字加入cur中cur += num# 如果num是负数,则需要加入优先队列中if num < 0:heappush(visited, num)# 一旦发现cur降为0或0以下,则贪心地将前面访问过的最小的负数移动到数组末尾# 但并不需要显式地进行移动,只需要弹出visited堆顶元素remove_num即可# 同时cur回复之前扣除的血量,即减去remove_num# 由于remove_num被移动到末尾,将其加入remove_total中# 由于必须要做1次移动,因此更新ansif cur <= 0:remove_num = heappop(visited)cur -= remove_num        remove_total += remove_numans += 1# 退出循环后,如果最后剩余血量cur加上被移动到末尾的血量remove_total仍然大于0# 则说明可以通过移动ans次房间,来顺利访问所有房间,# 否则返回-1,说明无论如何调整都无法访问所有房间,血量必然会扣为0return ans if cur + remove_total > 0 else -1

Java

class Solution {public int magicTower(int[] nums) {int ans = 0;long cur = 1;PriorityQueue<Integer> visited = new PriorityQueue<>(); // 小根堆long removeTotal = 0;for (int num : nums) {cur += num;if (num < 0) {visited.add(num);}if (cur <= 0) {int removeNum = visited.poll();cur -= removeNum;removeTotal += removeNum;ans++;}}return (cur + removeTotal > 0) ? ans : -1;}
}

C++

class Solution {
public:int magicTower(vector<int>& nums) {int ans = 0;long long cur = 1; // 使用long long 类型,防止溢出priority_queue<int, vector<int>, greater<int>> visited; // 小根堆long long remove_total = 0;for (int num : nums) {cur += num;if (num < 0) {visited.push(num);}if (cur <= 0) {int remove_num = visited.top();visited.pop();cur -= remove_num;remove_total += remove_num;ans++;}}return (cur + remove_total > 0) ? ans : -1;}
};

时空复杂度

时间复杂度:O(NlogN)。入堆操作的时间复杂度为O(logN)

空间复杂度:O(N)。堆所占空间。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

.gitlab-ci.yml文件参数配置和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

AUTOSAR内存篇 -EEPROM Driver(Eep)

文章目录 简介缩写术语功能介绍一般行为错误分类错误检测API参数错误EEPROM状态检查EEPROM作业遇到的硬件故障超时监督作业处理的一般要求读作业的处理写作业处理擦作业的处理对比作业的处理API介绍类型定义

Webpack源码浅析

webpack启动方式 webpack有两种启动方式&#xff1a; 通过webpack-cli脚手架来启动&#xff0c;即可以在Terminal终端直接运行&#xff1b; webpack ./debug/index.js --config ./debug/webpack.config.js通过require(webpack)引入包的方式执行&#xff1b;其实第一种方式最终…

安装opencart

设置网站用户权限 chown -R www:www /home/wwwroot/www.vapewholesalechina.com/ 设置open_basedir防跨目录 vim /usr/local/nginx/conf/fastcgi.conf chattr -i /home/wwwroot/www.vapewholesalechina.com/.user.ini https://lnmp.org/faq/lnmp-vhost-add-howto.html …

zabbix server/agent源码编译成rpm包(通用版-小白教程)

前言 工作环境需要用到很多信创的操作系统&#xff0c;zabbix agent2的官方没有现成的包可用&#xff0c;网上巴拉了一下找到zabbix agent2通用版编译成rpm包的方法 思路&#xff1a;假如当你有一批ky10_x86的机器需要配套的zabbix agent的rpm包&#xff0c;那就找一台ky10_x…

计组学习笔记2024/2/5

记录每天学到了什么,同时在挪移图片过程中再次理解加深印象 学计算机最重要的是理解,而不是整齐的笔记,不要主次搞混,所以以后记笔记的模式也要改一下(主要还是自己太菜,还达不到一边做到整齐笔记的同时还能够有时间做到理解,所以只能舍弃整齐时间保留理解时间)(不过如果有现成…

针对物联网应用优化 Cortex-M0+ 微控制器的功耗消耗”

为了针对物联网应用优化 Cortex-M0 微控制器的功耗消耗&#xff0c;我们可以采取一系列措施&#xff0c;包括优化代码、使用低功耗模式、优化外设配置等。以下是对 Cortex-M0 微控制器功耗消耗优化的详细解释&#xff0c;并提供示例代码以演示如何在物联网应用中优化功耗。 ✅作…

淘客返利系统:揭秘技术背后的实现方案

淘客返利系统&#xff1a;揭秘技术背后的实现方案 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨淘宝客返利系统的技术实现方案&#xff0c;为您…

敏捷开发的INVEST原则

很久没来这个社区发点文章了&#xff0c;是因为工作的变动很大。 上一篇文章&#xff0c;我还在讨论专项测试领域&#xff0c;如何在金融投资领域进行测试&#xff0c;如何把控测试管理。 现在我要做的是质量体系建设的咨询&#xff0c;上升的高度和领域发生了变化。 我现在…

centos系统初始配置

centos 7网络配置、主机名配置、修改hosts文件、ssh服务和远程登录。 静态网络配置 主机名配置 ssh服务和远程登陆

Nginx: a little source code

Nginx被称为C程序员必学的源码之一&#xff0c;我觉得名副其实&#xff0c;它的事件机制、内存管理、进程通信都可以说是顶级实践&#xff0c;非常值得学习。 Nginx源码比较多&#xff0c;本文只看几个重要的模块&#xff0c;更详细的内容请参考《深入理解nginx模块开发与架构》…

Striped64源码阅读

文章目录 简介模型代码分析成员变量方法 补充ThreadLocalRandomContended注解 - 解决伪共享问题LongAdder & LongAccumulator 参考链接 本人的源码阅读主要聚焦于类的使用场景&#xff0c;一般只在java层面进行分析&#xff0c;没有深入到一些native方法的实现。并且由于知…

6.s081 学习实验记录(五)traps

文章目录 一、RISC-V assembly简介问题 二、Backtrace简介注意实验代码实验结果 三、Alarm简介注意实验代码实验结果 一、RISC-V assembly 简介 git checkout traps&#xff0c;切换到traps分支user/call.c 文件在我们输入 make fs.img 之后会被汇编为 call.asm 文件&#xf…

网络原理TCP/IP(5)

文章目录 IP协议IP协议报头地址管理网段划分特殊的IP地址路由选择以太网认识MAC地址对比理解MAC地址和IP地址DNS&#xff08;域名服务器&#xff09; IP协议 IP协议主要完成的工作是两方面&#xff1a; 地址管理&#xff0c;使用一套地址体系&#xff0c;来描述互联网上每个设…

day20网页基本标签

网页基本标签 标题标签段落标签换行标签水平线标签字体样式标签注释和特殊符号 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网页基本标签</title> </head> <body> <!--标题…

CTFshow web(php特性 105-108)

web105 <?php /* # -*- coding: utf-8 -*- # Author: Firebasky # Date: 2020-09-16 11:25:09 # Last Modified by: h1xa # Last Modified time: 2020-09-28 22:34:07 */ highlight_file(__FILE__); include(flag.php); error_reporting(0); $error你还想要flag嘛&…

BVH动画绑骨蒙皮并在Unity上展示

文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式&#xff0c;选中要绑定的模型&#xff0c;然后进入Edit模式把骨骼和关节对齐。 &#xff08;选中骨骼&#xff0c;G移动&#xff0c;R旋转&#xff09; 为…

如何使用NimExec通过无文件命令执行实现横向移动

关于NimExec NimExec是一款功能强大的无文件远程命令执行工具&#xff0c;该工具专为红队研究人员设计&#xff0c;使用Nim语言开发&#xff0c;基于服务控制管理器远程协议&#xff08;MS-SCMR&#xff09;实现其功能&#xff0c;可以帮助广大研究人员在目标网络系统中实现横…

婚姻是什么哩?

我们应该明白&#xff0c;或许以后也会明白。婚姻应该是爱情的结晶&#xff0c;而不是父母亲戚的催促。当你遇到一个人&#xff0c;一个合适的、合拍的人&#xff0c;你自然而然就会有想结婚的想法。遇到一个能随时发起聊天&#xff0c;聊起来能忽视时间的人&#xff0c;真的会…

谈谈mybatis的理解(一)

mybatis不允许方法的重载&#xff0c;因为ID不能重复 mybatis 为什么要使用mybatis? JDBC的弊端&#xff1a; 硬编码&#xff1a;SQL语句存在Java代码中&#xff0c;不能很好的分离数据库语句和Java语句&#xff0c;造成代码不易维护 代码重复度高&#xff1a;大量重复的…