LeetCode 494. 目标和(DFS+DP)
文章目录
- 1. 题目
- 2. 解题
- 2.1 递归
- 2.2 DP
1. 题目
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 +
或 -
中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例 1:输入: nums: [1, 1, 1, 1, 1], S: 3
输出: 5
解释: -1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5种方法让最终目标和为3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/target-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 递归
class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int count = 0;bt(0,0,nums,S,count);return count;}void bt(int i, int cursum, vector<int>& nums, int &S, int &count) {if(i == nums.size()){if(cursum == S)++count;return;}bt(i+1,cursum+nums[i],nums,S,count);bt(i+1,cursum-nums[i],nums,S,count);}
};
循环BFS,超时
class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int count = 0, n, lv = 0;queue<int> q;q.push(0);while(!q.empty()){n = q.size();while(n--){if(lv == nums.size()){if(q.front()==S)++count;q.pop();}else{q.push(q.front()+nums[lv]);q.push(q.front()-nums[lv]);q.pop();}}lv++;}return count;}
};
2.2 DP
参考别人的
假设P是正子集,N是负子集 例如: 假设nums = [1, 2, 3, 4, 5],target = 3,一个可能的解决方案是+1-2+3-4+5 = 3 这里正子集P = [1, 3, 5]和负子集N = [2, 4]
如何将其转换为子集求和问题:
sum(P) - sum(N) = target
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)2 * sum(P) = target + sum(nums)
原来的问题转化为一个求子集的和问题: 找到nums的一个子集 P,使得sum( P ) = (target + sum(nums)) / 2,从上面最后个式子,可看出 target+sum(nums) 为偶数
class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int i, j, sum_nums = 0;for(i = 0; i < nums.size(); ++i)sum_nums += nums[i];if((long(sum_nums)+S)%2 != 0 || S > sum_nums)return 0;S = (S+sum_nums)>>1;long *dp = new long [S+1];memset(dp,0,(S+1)*sizeof(long));dp[0] = 1;for(i = 0; i < nums.size(); ++i){for(j = S; j >= 0; --j){if(dp[j] != 0 && j+nums[i] <= S)dp[j+nums[i]] += dp[j];}}return dp[S];}
};
LeetCode 494. 目标和(DFS+DP)相关推荐
- LeetCode—494. 目标和(Target Sum)——分析及代码(Java)
LeetCode-494. 目标和[Target Sum]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代码 (3)结果 2. 动态规划+节省空间 (1)思路 ...
- leetcode - 494. 目标和
494. 目标和 -------------------------------------------- 给定一个非负整数数组,a1, a2, -, an, 和一个目标数,S.现在你有两个符号 + ...
- leetcode 494. 目标和
目标和题解集合 记忆化搜索 动态规划 滚动数组优化 一维优化---巧妙转换为01背包问题 记忆化搜索 思路: 将问题转化为对一颗多叉树的遍历,而这里每个数字都有+与-的两种选择,因此这里是构造成二叉树 ...
- 96. Leetcode 494. 目标和 (动态规划-背包问题)
步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是:装满当前的容量j,有多少种装法?, 存的是方法的数量 步骤二.推断状态方程: dp[j] += dp[j-nums[i]] 步骤三.规定初始 ...
- leetcode 494. 目标和
给你一个整数数组 nums 和一个整数 target . 向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 ...
- DP | 16 494.目标和*
本文记录的是刷题过程中的重要概念和笔记.如有侵权,请联系删除. 目录 494.目标和 思路 DP DP五部曲 1.确定dp数组(dp table)以及下标的含义 2.递推公式 3.dp数组初始化 4. ...
- LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)
今日主要总结一下动态规划0-1背包的一道题目,494. 目标和问题 题目:494. 目标和 Leetcode题目地址 题目描述: 给你一个整数数组 nums 和一个整数 target . 向数组中的每 ...
- 【Leetcode刷题】:Python:494. 目标和
题目 494. 目标和 代码:dp class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int ...
- LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零
1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...
最新文章
- Google Brain团队最新视频介绍
- Python学习之使用Python生成PDF报告
- Tensorflow【实战Google深度学习框架】预训练与微调含代码(看不懂你来打我)
- 通过 ViewState 保存 Self-Tracking Entities
- linux 下 select 函数的用法
- 体验XHProf(linux版本)
- 论定期修改电脑密码的重要性
- 使用ajax完成python flask前端与后台数据的交互
- ZZULIOJ 1100: 求组合数(函数专题)
- php学习笔记0001 变量作用域
- mysql双击同步_求助,WINDOWS下MYSQL双机同步的问题
- 细胞自动机 通用计算机,科学网—《走近混沌》-27-初级细胞自动机 - 张天蓉的博文...
- div 设置a4大小_转载 网页打印时设置A4大小
- 磁盘属性显示为RAW的SD卡CF卡U盘和硬盘怎么办?
- 安卓开发 之小白养成-Android环境搭建 二
- Nginx负载均衡是酱紫做的
- 计算机内存数值存储方式(原码、反码、补码)
- 合并请求格式太乱?工单内容各写各的?表单模板来帮你
- 记录从指尖悄悄流逝的时间
- LeetCode_二分图_中等_785. 判断二分图
热门文章
- html 转word c#,c#操作word类,进行html和word文档的互相转换
- jdbc mysql demo_JDBC_demo:java连接mysql过程
- 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
- spring-boot+swagger实现WebApi文档
- appium+java(五)微信小程序自动化测试实践
- 1006实验一实验报告
- 【Head First Java 读书笔记】(一)基本概念
- CSS 中的定位:relative,absolute
- Hibernate+mysql 中文问题解决方案.
- 科大讯飞2021笔试题