数据结构学习 Leetcode494 目标和

关键词:动态规划 01背包 dfs回溯

一个套路:

  • 01背包:空间优化之后dp【target+1】,遍历的时候要逆序遍历
  • 完全背包:空间优化之后dp【target+1】,遍历的时候要正序遍历

题目:

解法一:

dfs 回溯

思路:

数组nums 的每个元素都可以添加符号+或-,因此每个元素有⒉种添加符号的方法,n个数共有2^n种添加符号的方法,对应2^n种不同的表达式。当n个元素都添加符号之后,即得到─种表达式,如果表达式的结果等于目标数target,则该表达式即为符合要求的表达式。
可以使用回溯的方法遍历所有的表达式,回溯过程中维护一个计数器count,当遇到一种表达式的结果等于目标数target时,将count的值加1。遍历完所有的表达式之后,即可得到结果等于目标数target的表达式的数目。

因为nums最多只有20,所以暴力的dfs应该是不会爆的。

回顾一下之前的dfs笔记吧!

中止条件:step>nums.size()

count统计符合个数

分出两个dfs,一个给+一个给-

复杂度计算:

时间复杂度O(2^n)

空间复杂度O(n)

代码:

class Solution {
public:int findTargetSumWays(std::vector<int>& nums, int target) {int count = 0, sum = 0;int step = 1;dfs(nums, target, step, sum, count);return count;}void dfs(std::vector<int>& nums, int target, int step, int sum, int& count){if (step == nums.size() + 1){if(sum == target)count++;return;}dfs(nums, target, step + 1, sum + nums[step - 1], count);dfs(nums, target, step + 1, sum - nums[step - 1], count);}
};

解法二:

动态规划 01背包

思路:

可以用非常巧的办法转换成用动态规划做。

 得到新的的目标为neg。

之后用01背包的知识就可以完成。

状态:dp[j]:前i个元素中,凑到目标j的方法总数。

转移方程:dp[j]=dp[j]+dp[j-nums[i]]

  • dp[j]:不需要第i个元素nums[i]的情况下,凑到目标j的方法总数。
  • dp[j-nums[i]]:需要第i个元素nums[i]的情况下,凑到目标j的方法总数。

初始条件:因为是计算总和所以设置为0

边界:dp[0]=1 前0个元素,凑到目标0的方法总数为1

复杂度计算:

时间复杂度O(nm) n=neg m=nums.size()

空间复杂度O(n) n=neg

代码:

class Solution {
public:int findTargetSumWays(std::vector<int>& nums, int target) {int sum = 0;for (const auto& x : nums)sum += x;int diff = sum - target;if (diff < 0 || diff & 1)return 0;int tar = diff / 2;std::vector<int> dp(tar + 1);//边界条件:当没有任何元素可以选取时,元素和只能是 0,对应的方案数是 1dp[0] = 1;//装0个重量,用0个装,一共有一种方法for (int i = 0; i < nums.size(); ++i){for (int j = tar; j >= nums[i]; --j){dp[j] += dp[j - nums[i]];}}return dp[tar];}
};

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

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

相关文章

MySQL数据库多版本并发控制(MVCC)

在数据库中&#xff0c;并发控制是确保多个事务能够同时执行&#xff0c;而不会导致数据不一致或冲突的关键机制。多版本并发控制(MVCC)是一种流行的并发控制方法&#xff0c;它可以允许多个事务同时读取同一数据项的不同版本&#xff0c;而不会相互阻塞。本文将讨论MVCC的原理…

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成&#xff0c;每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义…

操作系统【设备管理】

设备管理 一、前言 学习了存储器管理后&#xff0c;继续学习设备管理&#xff0c;设备管理的主要功能有缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等&#xff0c;由于I/O设备不仅种类繁多&#xff0c;而且他们的特性和操作方式往往相差甚大&#xff0c;使得设…

MySQL按月分片

一、按照月分片 使用场景为按照自然月来分片,每个自然月为一个分片,但是一年有12个月,是不是要有12个数据节点才行呢?并不是。例如我现在只有三个分片数据库,这样就可以1月在第一个数据分片中,2月在第二个数据分片中,3月在第三个数据分片中,当来到4月的时候,就会重新开…

python抽象基类之_subclasshook_方法

Python的鸭子特性&#xff08;duck typing&#xff09; Python中自定义的类只要实现了某种特殊的协议&#xff0c;就能赋予那种行为&#xff0c;举一个简单的例子&#xff1a; class A:def __len__(self):return 0 a A() print(len(a)) 如上所示&#xff0c;自己定义了一个类…

大数据Doris(四十三):创建物化视图

文章目录 创建物化视图 一、首先你需要有一个Base表

【基础篇】五、类的双亲委派机制

文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q & A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器&#xff0c;某个类A&#xff0c;到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用&#xff1a; 保证类加载的安全性&#xff1a;避…

一招搞定找不到vcruntime140_1.dll无法继续执行此代码

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法加载某某.dll文件”。而其中一个常见的问题就是vcruntime140_1.dll丢失。那么&#xff0c;vcruntime140_1.dll到底是什么&#xff1f;为什么会出现丢失的情…

django之drf框架(排序、过滤、分页、异常处理)

排序 排序的快速使用 1.必须是继承GenericAPIView及其子类才能是用排序 导入OrderingFilter类&#xff0c;from rest_framework.filters import OrderingFilter 2.在类中配置类属性 filter_backends[OrderingFilter] 3.类中写属性 ordering_fields [price,id] # 必须是表的…

【快速全面掌握 WAMPServer】04.人生初体验

网管小贾 / sysadm.cc 我们在前面的教程中为小伙伴们详细地介绍了 WampServer 的安装方法&#xff0c;相信大家对于如何安装应该已经有了一个比较完全的掌握。 在完全掌握安装方法之后&#xff0c;我们还可以更加便捷地使用我为大家提供的一键安装批处理程序来快速搞定安装部署…

Vue 问题解决

一、问题&#xff1a;TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时&#xff0c;必须加{}。 二、问题&#xff1a;Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象&#xff1a;①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…