数据结构学习 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://xiahunao.cn/news/2659357.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统——进程(六) 进程地址空间

进程地址空间 C/C程序员一般将我们所写的程序看成如下这种结构&#xff1a; 我们所写的程序通过编译编译之后就可以以这样的方式进行分布. 我们先通过编写一段C语言代码来进行验证&#xff1a; 运行结果&#xff1a; 我们可以看出来上述地址遵循的就是我们上面画的一种结构。…

树莓派安装Nginx搭建web服务器结合内网穿透实现无公网IP远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

数据分析-23--糖尿病预测(线性回归模型)(包含数据代码)

文章目录 0. 数据代码下载1. 项目介绍2. 数据处理1. 导入数据2. 处理数据 3. 建立模型4. 考察单个特征 0. 数据代码下载 关注公众号&#xff1a;『AI学习星球』 回复&#xff1a;糖尿病预测 即可获取数据下载。 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或➕v&am…

【linux】touch的基本使用

碎碎念 刚接触linux时候的几个最基础的命令之一&#xff0c;用来创建文件。如果使用touch --help的时候会发现作者对于touch的简介&#xff1a;Update the access and modification times of each FILE to the current time.用于修改文件的访问和时间戳 带我的leader属于那种…

PDF控件Spire.PDF for .NET【安全】演示:修改加密PDF的密码

修改PDF文件的密码确实是一个理性的选择&#xff0c;尤其是当密码被某人知道并且您的PDF文件不再安全时。Spire.PDF for .NET使您能够用 C#、VB.NET 修改加密 PDF 文件的密码。您可以修改所有者密码和用户密码&#xff0c;并设置访问 PDF 文件时的用户限制。现在请看修改加密PD…

【软件工程大题】数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…

关键字:static关键字

在 Java 编程语言中&#xff0c;static关键字有以下几种主要用法&#xff1a; 静态变量&#xff1a;使用static修饰的变量被称为静态变量。静态变量属于类级别&#xff0c;而不是属于类的实例。这意味着无论创建了多少个类的实例&#xff0c;只会有一个静态变量的副本被所有实…

【Spring Security】认证之案例的使用、MD5加密、CSRF防御

目录 一、引言 1、什么是SpringSecurity认证 2、为什么使用SpringSecurity之认证 3、实现步骤 二、快速实现&#xff08;案例&#xff09; 1、添加依赖 2、配置 3、导入数据表及相关代码 4、创建登录页及首页 5、创建配置Controller 6、用户认证 6.1、用户对象User…

如何用Python批量计算Word中的算式

一、问题的提出 到了期末&#xff0c;大家都在忙着写总结、改试卷、算工作量&#xff0c;写总结可以借助于ChatGPT&#xff0c;改试卷可以用星火的自动批阅功能&#xff0c;算工作量就是一项比较棘手的问题&#xff0c;因为它涉及很多算式&#xff0c;有时需要老师用计算器算来…

判断电话号码是否重复-excel

有时候重复的数据不需要或者很烦人&#xff0c;就需要采取措施&#xff0c;希望以下的方法能帮到你。 1.判断是否重复 方法一&#xff1a; 1&#xff09;针对第一个单元格输入等号&#xff0c;以及公式countif(查找记录数的范围&#xff0c;需要查找的单元格&#xff09; 2…

二叉树题目:在二叉树中分配硬币

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;在二叉树中分配硬币 出处&#xff1a;979. 在二叉树中分配硬币 难度 6 级 题目描述 要求 给定一个有 n \texttt{n} n 个结点的二叉树的根结点 r…

删除数据后, redis 内存占用还是很高怎么办?

现象&#xff1a; reids 做了数据删除&#xff0c;数据量不大&#xff0c;使用 top 命令看&#xff0c;发现还是占用大量内存 原因&#xff1a; 1.redis 底层内存根据内存分配器分配&#xff0c;不会立刻释放 2.redis 释放的内存空间不是连续的&#xff0c;存在碎片 内存碎…

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hms-1,728/ 靶场下载&#xff1a;https://download.vulnhub.com/hms/niveK.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月28日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a;niveK 靶场系…

基于ssm的学生就业管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生就业管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

大数据Doris(四十二):使用物化视图

文章目录 使用物化视图 一、​​​​​​​创建物化视图

JSoup 爬虫遇到的 404 错误解决方案

在网络爬虫开发中&#xff0c;使用JSoup进行数据抓取是一种常见的方式。然而&#xff0c;当我们尝试使用JSoup来爬虫抓取腾讯新闻网站时&#xff0c;可能会遇到404错误。这种情况可能是由于网站的反面爬虫机制检测到了我们的爬虫行为&#xff0c;从而拒绝了我们的请求。 假设我…

深入探索MongoDB集群模式:从高可用复制集

MongoDB复制集概述 MongoDB复制集主要用于实现服务的高可用性&#xff0c;与Redis中的哨兵模式相似。它的核心作用是数据的备份和故障转移。 复制集的主要功能 数据复制&#xff1a;数据写入主节点&#xff08;Primary&#xff09;时&#xff0c;自动复制到一个或多个副本节…

科荣AIO UtilServlet存在任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 科荣AIO是一款企业管理软件&#xff0c;提供企业一体化管理解决方案。它整合了ERP&#xff08;如进销存、财务管理&#xff09;、OA&#xff08;办公自动化&#xff09;、CRM&#xff08;客户关系管理&#xff09…

Solidworks中子装配不能再总装配中转动

问题&#xff1a; 今天在Solidworks中装配零部件的时候发现&#xff0c;子装配体中能实现的相对转动关系&#xff0c;在总装配体中无法做到。 解决方案&#xff1a; 上网查询&#xff0c;发现解决方案是&#xff1a; 在总装配体导航栏中&#xff0c;在子装配体处点击右键&am…

使用 Postman 实现 API 自动化测试

背景介绍 相信大部分开发人员和测试人员对 postman 都十分熟悉&#xff0c;对于开发人员和测试人员而言&#xff0c;使用 postman 来编写和保存测试用例会是一种比较方便和熟悉的方式。但 postman 本身是一个图形化软件&#xff0c;相对较难或较麻烦&#xff08;如使用 RPA&am…