算法第十一天-组合总和Ⅳ

组合总和Ⅳ

题目要求

解题思路

来自[负雪明烛]
题目有个明显的提示:求组合的个数,而不是每个组合。如果是要求出每个组合,那么必须使用回溯法,保存所有路径。但是如果是组合个数,一般都应该想到[动态规划]的解法。
直接写出[动态规划]的解法,是有一定难度的。不妨先写出[记忆化递归],然后进行修改[动态规划]。

方法一:递归

要求构成target有多少种组合方法,这里的变量应该是target,所以,令函数dp(x)表示从nums中挑选数字可以构成x的方法数(递归最基本的就是理解这个定义!)。最终返回的应该是dp(target)
对于题目输入nums=[1,2,3],target =4的时候:要求有多少种方法能够组成4,即要求dp[4]。思考过程如下:
我们遍历nums,判断如果构成target的时候,选择了nums[i],那么剩余的target-nums[i]仍在nums中选择的话,会有多少种方法。
于是一步一步出现了递归。这就是将大问题拆成小问题,然后发现小问题恰好可以用同样的函数解决,这就是递归思想。递归是一种思想与现象,绝不是为了递归而递归。
那么递归终止条件是什么呢?也就是说最基础的case应该直接返回什么结果?

  • 如果给出的数字都是正整数,因此如果当要求的target<0的时候,无论如何都无法从数组中挑选元素构成,所以应该返回0;
  • 当要求的target==0 的时候,需要return 1。为什么?因为我们注意题目给出的输入target一定是大于0的,如果在递归的时候target==0,说明在for循环中的target-num得到了0,表示nums数组中乔安后有一个数字等于target。所以需要返回1。
    会超时。
    时间复杂度: O ( N t r a g e t ) O(N^{traget}) O(Ntraget),N是nums的长度,每次递归需要计算N次,递归深度最多target。
    空间复杂度: O ( t a r g e t ) O(target) O(target)

方法二:记忆化递归

上面递归方法会超时,是因为有重复计算,比如计算dp(4)的时候,计算了dp(2),而计算dp(3)的时候又再次计算了dp(2)。如果我们在递归的过程中,把已经计算了的结果放在数组、字典中保存,那么下次需要再计算相同的值的时候,直接从数组/字典中调用相同的计算结果,就能省下很多计算。
下面的代码演示了如何使用[记忆化递归]。定义了一个dp数组,保存已经计算量的每个dp(x)dp数组的每个位置初始化为-1,表示还没计算过。在递归函数刚开始的时候,不仅要判断target是否<0,还要判断当前计算的target是否计算过(即dp[target] !=-1)。只有在没计算过的情况下,才执行递归。并且在执行递归之后,需要把当前target的计算结果保存到dp数组中。

代码:
class Solution(object):def combinationSum4(self, nums, target):self.dp = [-1] * (target + 1)self.dp[0] = 1return self.dfs(nums, target)def dfs(self, nums, target):if target < 0: return 0if self.dp[target] != -1:return self.dp[target]res = 0for num in nums:res += self.dfs(nums, target - num)self.dp[target] = resreturn res
复杂度分析

时间复杂度: O ( N ∗ t a r g e t ) O(N * target) O(Ntarget)
空间复杂度: O ( t a r g e t ) O(target) O(target)

方法三:动态规划

理解了[记忆化递归]之后,离写出动态规划只有一步之遥。递归是自顶向下的计算方式(大问题-》小问题),而动态规划是自底向上的计算方式(小问题-》大问题)
动态规划也同样地定义dp数组,dp[i]表示从nums中抽取元素组成target的方案数。dp数组的长度是target+1。其中dp[0]表示从数组中抽取任何元素组成0的方案数,根据我们在递归时的分析,我们需要知道令dp[0] = 1。其他位置的dp[i]需要初始化为0,表示我们还没有计算过这个位置,默认的方案数为0。
想要计算得到target,需要把dp[1~target]的各个元素都计算出来。每个位置的计算都是为了后面的计算做准备。

代码:
class Solution(object):def combinationSum4(self, nums, target):dp = [0] * (target + 1)dp[0] = 1res = 0for i in range(target + 1):for num in nums:if i >= num:dp[i] += dp[i - num]return dp[target]
复杂度分析:

时间复杂度: O ( N ∗ t a r g e t ) O(N * target) O(Ntarget)
空间复杂度: O ( t a r g e t ) O(target) O(target)

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

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

相关文章

记录 搭载小车 运行激光slam lio-sam fast-lio2

用了将近一个月搭载了一台履带车 其中 主控&#xff1a;NUC i7-8559U 激光雷达为&#xff1a;velodyne16线和hesai64线 IMU为&#xff1a;轮趣N100 mini 对imu使用上位机进行调平矫正 设置输出400HZ 对外参标定 首先使用velodyne16线 安装驱动直接运行&#xff0c;没遇到啥…

人工智能_机器学习092_使用三维瑞士卷数据_利用分层聚类算法进行瑞士卷数据三维聚类---人工智能工作笔记0132

然后我们使用分层聚类算法来对我们导入的瑞士卷数据进行聚类 agg =AgglomerativeClustering(n_clusters = 6,linkage = ward) 可以看到这里我们使用的,聚类距离计算用的是,ward这种,最小化簇内方差的形式,l进行聚类对吧 可以看到这个linkage参数有好几个选择对吧,是之前我们讲过…

网络通信理论-入门1

网口框架 100M 2. 物理层解读 2.1 同步的方法&#xff1a;编码 为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置&#xff0c;在传输信号时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码&#xff0c;在 100BASE-T 中则采用 4B/…

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述&#xff1a; JDBC&#xff1a;是一种执行sql语句的Java APL&#xff0c;可以为多种关系类型数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。有了JDBC&#xff0c;Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL&#xf…

Python+PyCharm的安装配置及教程(实用)

python and PyCharm 安装教程可参考&#xff1a;https://blog.csdn.net/wangyuxiang946/article/details/130634049 Pyhon 下载地址&#xff1a;https://www.python.org/downloads/ PyCharm 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindo…

AP9196 DC-DC升压恒流电源管理芯 3-40V 200W升降压线路图

产品说明 AP9196 是一系列电路简洁的宽调光比升压调光恒流驱动器&#xff0c;适用于 3-40V 输入电压范围的 LED照明领域。AP9196 采用我司专利算法&#xff0c;可以实现高精度的恒流效果&#xff0c;输出电流恒流精度≤3&#xff05;&#xff0c;电压工作范围为5-40V&#xff0…

在Fiber中处理请求和响应

掌握GoLang Fiber中请求和响应管理的艺术&#xff0c;以实现高效的Web开发 在Web开发领域&#xff0c;有效地处理请求和响应是构建既用户友好又高效的Web应用的基石。该过程涉及管理传入的HTTP请求、解析数据和参数、构建适当的响应、处理不同的响应类型以及优雅地处理错误。对…

湖仓架构的演进

1.数据仓库架构的历史演进 起初&#xff0c;业界数据处理首选方式是数仓架构。通常数据处理的流程是把一些业务数据库&#xff0c;通过ETL的方式加载到Data Warehouse中&#xff0c;再在前端接入一些报表或者BI的工具去展示。 数据仓库概念是 Inmon 于 1990 年提出并给出了完…

求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造

12日20日&#xff0c;中国信息通信研究院&#xff08;简称&#xff1a;信通院&#xff09;和中国通信标准化协会大数据库技术推进委员会&#xff08;CCSA TC601&#xff09;共同组织的2023年大数据库“星河&#xff08;Galaxy&#xff09;”案例评选结果发布。中国移动通信集团…

【Bootstrap学习 day13】

Bootstrap5 下拉菜单 下拉菜单通常用于导航标题内&#xff0c;在用户鼠标悬停或单击触发元素时显示相关链接列表。 基础的下拉列表 <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggl…

亚马逊速卖通eBay测评补单:批量注册买家账号如何保证成功率

在当今的电商领域&#xff0c;测评如同一面镜子&#xff0c;为商家展现出产品的真实面貌。对于商家而言&#xff0c;自行养号进行测评的重要性日益凸显。 与依赖国外买手或测评服务商相比&#xff0c;自行搭建账号具有以下优势&#xff1a; 一&#xff0c;可以避免买家账号资…

win10电脑提示“KBDSG.DLL文件缺失”,软件游戏无法启动运行,快速修复方法

很多用户在日常使用电脑的时候&#xff0c;或多或少都遇到过&#xff0c;在启动游戏或软件的时候&#xff0c;Windows桌面会弹出错误提示框“KBDSG.DLL文件缺失&#xff0c;造成软件无法启动或运行&#xff0c;请尝试重新安装解决”。 不少用户&#xff0c;会根据提示重装游戏或…

STM32疑难杂症

1.keil的奇怪问题 创建的数组分配内存到0x10000000地址的时候,数据总是莫名其妙的出现问题,取消勾选就正常了 stm32f407内部有一个CCM内存,这部分内存只能由内核控制,任何外设都不能够进行访问。这样问题就来了,如果使用keil5进行编程时勾选了这个选项(下图),则编译的…

[每周一更]-(第50期):Go的垃圾回收GC

参考文章&#xff1a; https://juejin.cn/post/7111515970669117447https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/https://liangyaopei.github.io/2021/01/02/g…

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年&#xff0c;经历非常多的大事情&#xff0c;找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松&#xff0c;有幸这一年全家人平平安安&#xff0c;在稳步前进。算是折腾的一年&#xff0c;杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

软件测试|SQL AND和OR运算符解析

简介 在SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;AND和OR是两个常用的逻辑运算符。它们用于组合条件来构建复杂的查询语句&#xff0c;帮助我们更精确地过滤和检索数据。本文将详细介绍SQL中的AND和OR运算符&#xff0c;包括其语法、用法以及使用时…

nginx原理和配置项详解

一、nginx原理 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。其工作原理和配置项如下&#xff1a; 工作原理&#xff1a; 反向代理&#xff1a;Nginx可以作为反向代理服务器&#xff0c;接收客户端的请求&#xff0c;然后将请求转…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年&#xff0c;最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世&#xff0c;到“千模大战”如火如荼&#xff0c;AIGC正式破圈&#xff0c;成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中&#xff0c;通过调研235家企业可知&#xff0…

VR与数字孪生:共同构筑未来的虚拟世界

随着科技的不断发展&#xff0c;数字孪生和VR已经成为当今热门的科技话题。作为山海鲸可视化软件的开发者&#xff0c;我们对这两者都有深入的了解。在此&#xff0c;我们将详细探讨数字孪生与VR的区别和联系。 首先&#xff0c;数字孪生&#xff08;Digital Twin&#xff09;…

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代&#xff0c;我们的日常生活正在经历一场革命&#xff0c;而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级&#xff0c;更是对我们生活品质的全方位提升。从智能感应到数据分析&#xff0c;从环保设计到舒…