LeetCode算法心得——零数组变换IV(0-1背包)

大家好,我是晴天学长,很久很久没有写算法题解了,今天开始转python了。💪💪💪


1)统计打字方案数

在这里插入图片描述
给你一个长度为 n 的整数数组 nums 和一个二维数组 queries ,其中 queries[i] = [li, ri, vali]。
每个 queries[i] 表示以下操作在 nums 上执行:
从数组 nums 中选择范围 [li, ri] 内的一个下标子集。 将每个选中下标处的值减去 正好 vali。
零数组 是指所有元素都等于 0 的数组。
返回使得经过前 k 个查询(按顺序执行)后,nums 转变为 零数组 的最小可能 非负 值 k。如果不存在这样的 k,返回 -1。
数组的 子集 是指从数组中选择的一些元素(可能为空)。


示例 1:

输入: nums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]

输出: 2

解释:

对于查询 0 (l = 0, r = 2, val = 1):
将下标 [0, 2] 的值减 1。
数组变为 [1, 0, 1]。
对于查询 1 (l = 0, r = 2, val = 1):
将下标 [0, 2] 的值减 1。
数组变为 [0, 0, 0],这就是一个零数组。因此,最小的 k 值为 2

示例 2:

输入: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]

输出: -1

解释:

即使执行完所有查询,也无法使 nums 变为零数组。

示例 3:

输入: nums = [1,2,3,2,1], queries = [[0,1,1],[1,2,1],[2,3,2],[3,4,1],[4,4,1]]

输出: 4

解释:

对于查询 0 (l = 0, r = 1, val = 1):
将下标 [0, 1] 的值减 1。
数组变为 [0, 1, 3, 2, 1]。
对于查询 1 (l = 1, r = 2, val = 1):
将下标 [1, 2] 的值减 1。
数组变为 [0, 0, 2, 2, 1]。
对于查询 2 (l = 2, r = 3, val = 2):
将下标 [2, 3] 的值减 2。
数组变为 [0, 0, 0, 0, 1]。
对于查询 3 (l = 3, r = 4, val = 1):
将下标 4 的值减 1。
数组变为 [0, 0, 0, 0, 0]。因此,最小的 k 值为 4

示例 4:

输入: nums = [1,2,3,2,6], queries = [[0,1,1],[0,2,1],[1,4,2],[4,4,4],[3,4,1],[4,4,5]]

输出: 4

提示:
1 <= nums.length <= 10
0 <= nums[i] <= 1000
1 <= queries.length <= 1000
queries[i] = [li, ri, vali]
0 <= li <= ri < nums.length
1 <= vali <= 10

2) .算法思路

我们首先注意到nums长度最长才只有10,我们可以枚举每一个询问,处理出一个arr[i],arr[i]也是一个数组,代表了的位置i有哪些询问可以使用,并且是有序的。然后对于每一个询问可以处理的位置,加到对应的位置的数组中即可。

然后对于每一个位置,就是判断选择这些询问,是否能够凑出这个位置的值,并且是在用到的询问最小的情况下,那么这就是01背包,对每一个位置我们都求一个01背包,定义f[i][j]代表了前i个询问是否能够凑出j。然后对于每一个位置求出的最少询问数求最大值。

需要注意的是,这道题如果num所有元素为0的时候,是直接返回0,需要判断一下,有点坑。


3) .算法步骤

1.创建一个二维数组arr,用于记录每个点能够被哪些区间覆盖。对于每个查询,遍历区间中的点,将该点与对应的查询值存储在arr中。

2.对于每个点,遍历其覆盖的区间,使用动态规划来尝试凑出该点的值。定义一个二维数组f,其中f[i][j]表示在考虑前i个区间的情况下,是否可以凑出值为j。

3.初始化f[0][0] = True,表示不选取任何区间时,可以凑出值为0。

4.对于每个区间,考虑选取或不选取该区间。如果选取该区间,则需要判断是否可以凑出值为j - arr[k][i][1]。

5.如果最终在考虑完所有区间后,可以凑出该点的值,则记录下使用的区间索引,并更新cur的值。

6.最终返回mx + 1,其中mx表示使用的区间索引的最大值。


4).代码示例

class Solution:def minZeroArray(self, nums: List[int], queries: List[List[int]]) -> int:if max(nums) == 0:return 0n = len(nums)m = len(queries)arr = [[] for _ in range(n)]#每个点能够被哪一些区间覆盖for i in range(m):l, r, val = queries[i]for j in range(l, r + 1):arr[j].append((i, val))#对于每一个点,问题转换为了在尽量少用的情况下,凑出nums[i]mx = -inffor k,x in enumerate(nums):f = [[False] * (x + 1) for _ in range(len(arr[k]) + 1)]f[0][0] = Truecur = inffor i in range(len(arr[k])):for j in range(x + 1):#不选f[i + 1][j] = f[i][j]#选if j - arr[k][i][1] >= 0:f[i + 1][j] |= f[i][j - arr[k][i][1]] if f[i + 1][x]:cur = min(cur,arr[k][i][0])breakelse:return -1mx = max(mx,cur)return mx + 1

5).总结

这个算法主要是通过动态规划来解决问题。首先,对于每个点,算法找出它能够被哪些区间覆盖。然后,问题转化为对于每个点,如何在尽量少的情况下凑出该点的值。


试题链接

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

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

相关文章

superset部署记录

具备网络条件的&#xff0c;完全可以一键部署&#xff0c;不需要折腾。网络条件不具备时&#xff0c;部署记录留存备查。 1、正常模式 详细介绍参考&#xff1a;【开源项目推荐】Apache Superset——最优秀的开源数据可视化与数据探索平台-腾讯云开发者社区-腾讯云 (tencent.c…

AI大模型完全指南:从核心原理到行业落地实践

目录 大模型技术演进脉络核心原理解析与数学基础主流大模型架构对比开发环境搭建与模型部署Prompt Engineering高阶技巧垂直领域应用场景实战伦理与安全风险防控前沿发展方向与学习资源 一、大模型技术演进脉络 1.1 发展历程里程碑 2017&#xff1a;Transformer架构诞生&…

HTB 学习笔记 【中/英】《前端 vs. 后端》P3

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 前端&#xff08;客户端&#xff09; 和 后端&#xff08;服务器端&#xff09; 的区别。解释了 全栈开发&#xff08;Full Stack Development&#xff09;&#xff0c;即前端后端开发。介绍了 前端和后端常用的技术。讨论…

golang中的结构体

1.简介 go也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以说go支持面向对象编程特性是比较准确的。go没有类(class)&#xff0c;go语言的结构体(struct)和其它编程语言的类(class)有同等的地位&#xff0c;你可…

Day 64 卡玛笔记

这是基于代码随想录的每日打卡 参加科学大会&#xff08;第六期模拟笔试&#xff09; 题目描述 ​ 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。 ​ 小明的起点是第一个车站&#xff0c;终点是最后一个车站。然…

《C语言中\0:字符串的神秘“终结者”》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 引言一、字符串的定义与存储二、\0&#xff1a;字符串的终结标志三、\0在字符串操作中的作用四、\0的陷阱与注意事项五、\0与字符串的动态分配六、总结 引言…

九、Prometheus 监控windows(外部)主机

一、监控 Windows 主机的方法 方式 1:使用 Windows Exporter Windows Exporter(wmi_exporter) 是 Prometheus 官方推荐的 Windows 监控工具,它可以采集 CPU、内存、磁盘、网络、进程、服务状态等 指标。 方式 2:使用 Node Exporter for Windows node_exporter 主要用于…

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手&#xff08;Three-way Handshake&#xff09;与四次挥手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次挥手&#xff08;Four-way Wave&#xff09;三、常见问题解答总结为什么三次握手不…

Java集成WebSocket实现消息推送,详细步骤以及出现的问题如何解决

Java集成WebSocket实现消息推送 WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合实现实时消息推送功能。与传统的HTTP请求-响应模式不同,WebSocket建立连接后可以保持长连接状态,服务器可以主动向客户端推送数据,这使得它成为实现聊天应用、通知系统和实时数…

如何在Linux中切换用户?

Linux切换用户 在Linux系统中&#xff0c;切换用户可以通过使用su命令和sudo命令实现 1、su命令 su是switch user的缩写&#xff0c;用于切换到另一个用户。su命令的语法如下&#xff1a; su [选项] [用户名]以下是一些示例&#xff1a; # 切换到root用户 su - # 切换到指定…

网页制作16-Javascipt时间特效の设置D-DAY倒计时

01、效果图 02、应用 new Date()//返回今天日期 new Date("April 1,2025")//返回目标日期 document.write()//文档显示 getTime()返回当日毫秒数 Math.floor(amadays / (1000 * 60 * 60 * 24)//把毫秒换算天 03、代码 <!doctype html> <html> &…

c#Winform也可以跨平台了GTK框架GTKSystem.Windows.Forms

一、简介 >> 新版下载&#xff0c;问题求助 QQ群&#xff1a;1011147488 1032313876 236066073&#xff08;满&#xff09; Visual Studio原生开发&#xff0c;无需学习&#xff0c;一次编译&#xff0c;跨平台运行. C#桌面应用程序跨平台&#xff08;windows、linux、…

`lower_bound`、`upper_bound` 和 `last_less_equal`

lower_bound、upper_bound 和 last_less_equal。它们的作用是在 有序数组 中查找目标值的位置。下面是对每个函数的详细解释&#xff1a; 1. lower_bound 函数 功能&#xff1a; 在有序数组 a 中查找第一个 大于或等于 target 的元素的位置。 参数&#xff1a; a[]&#xf…

网络安全常识科普(百问百答)

汪乙己一到店&#xff0c;所有喝酒的人便都看着他笑&#xff0c;有的叫道&#xff0c;“汪乙己&#xff0c;你又监控员工隐私了&#xff01;”他不回答&#xff0c;对柜里说&#xff0c;“来两个fofa。”便排出三个比特币。他们又故意的高声嚷道&#xff0c;“你一定又在电报群…

JSON 序列化 反序列化

序列化&#xff0c;反序列化 其实就是转换数据格式的过程。 序列化 (Serialization) 是将【对象的状态信息】转换为【可以存储或传输的形式】的过程。即&#xff1a;把C#中的类 转换成 JSON格式的字符串&#xff0c;就是序列化。其中【对象的状态信息】就是类的各种属性。 …

如何优化AI模型的Prompt:深度指南

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI模型在文本生成、翻译、问答等领域的应用越来越广泛。在使用这些模型时&#xff0c;**Prompt&#xff08;提示&#xff09;**的质量直接影响输出结果的好坏。优化Prompt不仅能提升生成文本的准确性&#xf…

五大基础算法——模拟算法

模拟算法 是一种通过直接模拟问题描述的过程或规则来解决问题的算法思想。它通常用于解决那些问题描述清晰、步骤明确、可以直接按照规则逐步实现的问题。以下是模拟算法的核心概念、适用场景、实现方法及经典例题&#xff1a; 一、核心概念 问题描述清晰 问题的规则和步骤明确…

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …

过滤空格(信息学奥赛一本通-2047)

【题目描述】 过滤多余的空格。一个句子中也许有多个连续空格&#xff0c;过滤掉多余的空格&#xff0c;只留下一个空格。 【输入】 一行&#xff0c;一个字符串&#xff08;长度不超过200&#xff09;&#xff0c;句子的头和尾都没有空格。 【输出】 过滤之后的句子。 【输入样…

一周学会Flask3 Python Web开发-SQLAlchemy更新数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili list.html页面&#xff0c;加一个更新操作超链接&#xff1a; <!DOCTYPE html> <html lang"en"> <…