力扣练习4.11

452. 用最少数量的箭引爆气球

不考虑y轴,可以将其转换为重叠区间的问题。将同属于一个重叠区间的小区间合并为一个区间,加上不重叠的区间,即是所求数量。
更加简化:如果是非重叠区间才加1,因为两个大的重叠区间间肯定是非重叠的。

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if not points:return 0# 根据右区间排序points.sort(key=lambda x: x[1])# 结果,所需数量res = 1 # 初始化为1,这样当仅有一个区间时也能正确返回# 区间末尾end = points[0][1]# 遍历剩余区间for i in range(1, len(points)):# 如果当前区间左界超过了区间末尾,说明不重叠if points[i][0] > end:res += 1 # 结果加一end = points[i][1] # 更新区间末尾return res

1710. 卡车上的最大单元数

贪婪算法,每次优先使用最能装的箱子,也要判断箱子数和该类箱子数的大小。

class Solution:def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:# 结果数res = 0# 根据单元数倒排boxTypes.sort(key=lambda x: x[1], reverse=True)# 索引i = 0# 限定循环条件while truckSize > 0 and i < len(boxTypes):# 如果说箱子数比该类箱子多,就使用全部该箱子if boxTypes[i][0] <=  truckSize:res += boxTypes[i][0] * boxTypes[i][1]truckSize -= boxTypes[i][0] # 更新箱子数# 否则,只能使用全部箱子数else:res += truckSize * boxTypes[i][1]truckSize = 0 # 更新箱子数i += 1 # 查找下一类箱子return res

494. 目标和

问题转化为0-1背包问题

题目要求我们计算通过在nums数组中的每个数字前添加+-,使得它们的总和等于给定的目标值target的方法数。实际上,这个问题可以转化为一个经典的0-1背包问题。

首先,假设我们把所有选用+的数字放入一个背包A中,所有选用-的数字放入另一个背包B中。那么,背包A的总和减去背包B的总和应该等于target。同时,背包A和背包B中数字的总和加起来就是nums数组中所有数字的总和,记为sum。基于这两个条件,我们可以得到以下两个等式:

  1. sumA - sumB = target
  2. sumA + sumB = sum

通过解这两个等式,我们可以得到 sumA = (target + sum) / 2。这意味着问题转化为了寻找nums数组中有多少种组合,使得这些组合的和等于(target + sum) / 2

解决0-1背包问题

这个转化后的问题是一个标准的0-1背包问题:给定一个容量为(target + sum) / 2的背包,nums数组中的每个数字都可以选择放入或不放入背包,求有多少种方法可以恰好填满背包。

我们可以使用动态规划来解决这个问题。定义一个一维数组dp,其中dp[j]表示用nums数组中的数字填满容量为j的背包的方法数。初始化dp[0] = 1,表示容量为0的背包有一种填法(即不放入任何数字)。

然后,对于nums数组中的每个数字num,我们更新dp数组:对于每个容量j(从(target + sum) / 2num),如果j >= num,则dp[j] += dp[j - num]。这表示如果当前数字可以放入容量为j的背包中,那么填满容量为j的背包的方法数就等于之前填满容量为j的方法数(不放入当前数字)加上填满容量为j - num的方法数(放入当前数字)。

代码实现
class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:total_sum = sum(nums)if abs(target) > total_sum or (target + total_sum) % 2 != 0:return 0package_a = (target + total_sum) // 2dp = [0] * (package_a + 1)dp[0] = 1for num in nums:for j in range(package_a, num - 1, -1):dp[j] += dp[j - num]return dp[package_a]
示例

输入: nums = [1, 1, 1, 1, 1], target = 3 输出: 5 解释: 有五种方法使得和为3:

  • +1+1+1-1-1
  • +1+1-1+1-1
  • +1-1+1+1-1
  • -1+1+1+1+1
  • +1-1-1+1+1

通过将问题转化为0-1背包问题,并应用动态规划方法,我们可以高效地求解出结果。

1137. 第 N 个泰波那契数

使用动态规划,下面是直接规划

class Solution:def tribonacci(self, n: int) -> int:# 直接在状态数组dp中初始化前三个Tribonacci数dp = [0, 1, 1] + [0] * (n - 2)# 从第4个数开始计算(索引3),因为前三个数已经初始化for i in range(3, n + 1):dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]return dp[n]

规避了要判断n是否小于3的操作,因为直接对dp的前三个进行赋值。
dp数组的前三个值被初始化为[0, 1, 1],这对应于n = 0、n = 1和n = 2的情况。如果n小于3,dp[n]将直接返回正确的结果,无需额外的条件判断。对于n >= 3的情况,for循环将按照Tribonacci数的定义计算每个数值,并存储在dp数组中。最后,直接返回dp[n]作为结果。

记忆化搜索方法:

class Solution:def tribonacci(self, n: int) -> int:# 保存记忆memo = [0 for _ in range(n+1)]return self.do(n, memo)def do(self, n, memo):if n == 0:return 0elif n < 3:return 1# 检查是否已经计算过if memo[n] != 0:return memo[n]# 如果没有被计算过memo[n] = self.do(n-3, memo) + self.do(n-2, memo) + self.do(n-1, memo)return memo[n]

576. 出界的路径数

题目概述

题目“576.
出界的路径数”要求计算一个点从网格中的特定位置开始,最多移动N步后,有多少种路径可以使它移出网格的边界。每一步,这个点可以向上、下、左、右四个方向之一移动。

解题思路

解决这个问题的关键是理解我们如何使用动态规划(DP)来跟踪每一步移动后各个位置的路径数量,并最终计算出所有导致出界的路径。

动态规划

  1. 定义状态: 我们定义一个二维数组dp[x][y]来表示当前步骤中从起始位置到达(x, y)的路径数。
  2. 状态转移: 对于每一步,我们根据前一步的dp数组计算当前步的dp数组。如果从(x, y)出发的下一步移动会导致出界,则将这部分路径数累加到最终的计数中。
  3. 初始化: 在第0步,我们将起始位置(i, j)的路径数设为1,因为在没有移动之前,存在一条路径停留在起点。

为了避免重复计算和节省空间,我们可以使用滚动数组技巧,即只维护两个二维数组交替表示当前步和前一步的状态。

边界处理

由于每一步移动都有可能导致点移出边界,我们需要在每一步检查四个方向的移动是否会导致出界。如果是,我们就把这次移动对应的路径数加到最终的计数中。

取模操作

由于路径数可能非常大,题目要求返回结果对10^9 + 7取模的值。这意味着每次累加路径数后,我们都应该对结果进行取模,以保证结果在合法的整数范围内。

代码实现

MOD = 10**9 + 7  # 定义模数,用于取模操作,防止整数溢出class Solution:def findPaths(self, m: int, n: int, N: int, i: int, j: int) -> int:if N == 0: return 0  # 如果没有移动次数,直接返回0dp = [[0] * n for _ in range(m)]  # 初始化dp数组,存储每个位置的路径数dp[i][j] = 1  # 将起始位置的路径数设为1count = 0  # 初始化出界路径的计数器for step in range(1, N+1):  # 遍历每一步temp = [[0] * n for _ in range(m)]  # 初始化临时数组,用于计算下一步的路径数for x in range(m):  # 遍历每个位置for y in range(n):for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:  # 遍历四个方向nx, ny = x + dx, y + dy  # 计算新位置if 0 <= nx < m and 0 <= ny < n:  # 如果新位置在网格内temp[x][y] += dp[nx][ny]  # 累加路径数到临时数组else:  # 如果新位置出界count += dp[x][y]  # 累加当前位置的路径数到出界计数器temp[x][y] %= MOD  # 对每一步的结果取模,防止溢出dp = temp  # 将临时数组的结果赋值给dp,为下一步做准备return count % MOD  # 返回最终的出界路径数,并对结果取模

示例

假设m = 2, n = 2, N = 2, i = 0, j = 0,则有6种路径可以在2步内从(0, 0)移出网格边界。

通过逐步应用动态规划并在每一步累加出界的路径数,我们可以找到从给定起始位置移动N步后出界的所有路径数。这种方法通过避免重复计算并优化空间使用,有效解决了问题。

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

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

相关文章

自然语言处理

自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学、人工智能和语言学领域的交叉学科&#xff0c;目标是通过机器学习和深度学习技术&#xff0c;让计算机能够理解和处理人类的自然语言&#xff0c;以执行各种任务&#xff0c;例如文本分类、…

如何正确使用数字化仪前端信号调理?(一)

一、前言 板卡式的数字转换器和类似测量仪器&#xff0c;比如图1所示的德思特TS-M4i系列&#xff0c;都需要为各种各样的特性信号与内部模数转换器&#xff08;ADC&#xff09;的固定输入范围做匹配。 图1&#xff1a;德思特TS-M4i系列高速数字化仪&#xff0c;包括2或4通道版…

买入----套住----再研究,凤凰雪球

雪球研究告一段落&#xff0c;今天买入了。&#xff08;最后一张图&#xff09; 跟之前产品的主要区别是&#xff0c;有效月的票息会当月支付。 &#xff08;图二&#xff09;是4种不同的情况下&#xff0c;对应的收益情况。 --------------------------分界线----------------…

Kimichat的浏览器插件Kimi Copilot:一键总结网页内容

在阅读网页的时候&#xff0c;如果需要总结网页内容要点&#xff0c;可以把链接丢进Kimichat&#xff0c;让它总结。但是&#xff0c;这样稍微有些麻烦。Chrome浏览器现在已经有一个非官方的Kimichat插件&#xff1a; Kimi Copilot - 网页总结助手&#xff0c;可以用Kimi AI一键…

XILINX 10G PCS PMA IP核使用

文章目录 一、设计框图二、模块设计三、IP核配置四、上板验证五、总结 一、设计框图 关于GT高速接口的设计一贯作风&#xff0c;万兆以太网同样如此&#xff0c;只不过这里将复位逻辑和时钟逻辑放到了同一个文件ten_gig_eth_pcs_pma_0_shared_clock_and_reset当中。如果是从第…

C#常见的数据缓存方式详解与实例

在C#开发中&#xff0c;数据缓存是一种优化应用程序性能的常见技术。合理的缓存策略可以减少对数据源的访问次数&#xff0c;提高数据处理速度&#xff0c;从而改善用户体验。下面将详细介绍几种在C#中常见的数据缓存方式&#xff0c;以及相应的实例。 1. 使用System.Runtime.…

C 头文件

头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它。前面我们已经…

基于一阶微分的图像增强-梯度法(不丢弃任何像素变化--信息的提取作用)

首先我大致说一下前一小节的内容&#xff1a;反锐化掩模与高提升滤波处理 图像的锐化方法&#xff0c;其实有很多。锐化的定义提升突变像素的灰度级&#xff0c;减少变化缓慢像素的灰度级。 为什么可以利用模糊图像来进行锐化呢&#xff1f;因为模糊图像的模糊位置通常都是原…

第十二篇-jQuery理论

jQuery定义 jQuery是一个快速、简洁的JavaScript库&#xff0c;它能够简化HTML文档遍历、事件处理、动画设计和Ajax交互。jQuery的设计目标是通过尽可能少的代码实现更多的功能&#xff0c;并且提供一种优雅的方式来处理HTML文档、处理事件、创建动画效果以及实现Ajax交互。. …

《前端防坑》- JS基础 - 你觉得Boolean(‘false‘) === false吗?

问题 你觉得Boolean(false) false吗&#xff0c; Boolean([]) false吗&#xff1f; 答案 Boolean(false) true, Boolean([]) true 验证 原因 Boolean 对象表示两个值&#xff1a;"true" 或 "false" 但是能使Boolean为flase的只有6种情况&#xff…

科技的成就(五十八)

543、神经网络应用于机器翻译 2003 年 2 月&#xff0c;神经网络开始应用于机器翻译。约书亚本吉奥等发表论文“A Neural Probabilistic Language Model”。他们的研究团队基于神经网络开发出了一个语言模型&#xff0c;改善了统计机器翻译中的问题&#xff0c;这项研究为未来神…

嵌入式单片机入职第二天-EEPROM与IIC

上午&#xff1a; 1.安装Jlink驱动&#xff0c;死活没反应&#xff0c;因为昨天才装完系统&#xff0c;领导让我装电脑主板驱动 领导方法进惠普官网通过查询电脑型号&#xff0c;里面几十个驱动搞得我眼花&#xff0c;领导告诉我进官网就去开会了&#xff0c;可能因为是外网&…

idea如何debug看springsecurity的过滤器顺序

idea如何debug看springsecurity的过滤器顺序 先配置一个Spring启动对象,后续需要根据这个对象来获取SpringSecurity的过滤器链 设置一个输出信息&#xff0c;需要在输出信息这里打上断点&#xff0c;才方便查看过滤器链 public static void main(String[] args) {//此时不…

Qt | 信号与槽 原理、连接、断开(面试无忧)

1、信号和槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。 2、Qt 的部件类中有一些已经定义好了的信号和槽,通常的作法是子类化部件…

yolov5旋转目标检测遥感图像检测-无人机旋转目标检测(代码和原理)

YOLOv5&#xff08;You Only Look Once version 5&#xff09;是一个流行且高效的实时目标检测深度学习模型&#xff0c;最初设计用于处理图像中的水平矩形边界框目标。然而&#xff0c;对于旋转目标检测&#xff0c;通常需要对原始YOLOv5架构进行扩展或修改&#xff0c;以便能…

达梦数据库安装教程

达梦数据库安装包与常规的数据库安装逻辑一致。 下载安装包 首先&#xff0c;您需要从达梦官方网站下载适用于您的操作系统的达梦数据库安装包&#xff08;这一步要注意区分硬件芯片类型。请注意&#xff0c;选择与您的操作系统和硬件平台相匹配的安装包&#xff0c;以免在安…

ChatGPT之道:发掘AI工具在论文写作中的妙用

ChatGPT无限次数:点击直达 ChatGPT之道&#xff1a;发掘AI工具在论文写作中的妙用 随着人工智能技术的快速发展&#xff0c;ChatGPT作为一款先进的自然语言处理工具&#xff0c;在各个领域展现出了非凡的潜力。本文将探讨ChatGPT在论文写作中的应用&#xff0c;以及如何利用其…

Imagination APXM-6200 CPU:性能卓越,安全可信

随着消费类和工业应用行业的不断发展&#xff0c;对创新性能和效率的需求永不停歇&#xff0c;我们自豪地推出旗下 Catapult CPU 系列的第二款产品&#xff1a;Imagination APXM-6200 CPU 。这款 64 位的高效 RISC-V 应用处理器具有强大的 AI 功能及性能密度&#xff0c;能够为…

阿里云服务器项目部署docker-compose+vue+redis+nginx+minio+springboot

1 阿里云服务器项目部署-单机部署 docker-compose 1.1 搭建背景 服务器 阿里云服务器 前端 vue 后端 springboot 服务 redis 、nginx、minio 都做单机模式部署,不做集群部署 博客内容参考了其他博文&#xff0c;会贴出来 1.2 <重要>端口开放前提说明 任何开放的端…

【迅为iTOP-4412-linux 系统制作(4)】ADB 或者 TF 卡烧写测试

准备工作 编译生成的内核镜像uImage 和设备树 dtb 文件“exynos4412-itop-elite.dtb”已经可以使用了。 把编译生成的uimage和dtb文件。拷贝fastboot工具。官方的u-boot-iTOP-4412.bin 也拷贝到 platform-tools 文件夹目录内。system.img 也拷贝到 platform-tools 文件夹目录…