目标和
给定一个非负整数数组,a1,a2,…,an,和一个目标数 S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例:
输入: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。
提示:
- 数组非空,且长度不会超过 20
- 初始的数组的和不会超过 1000
- 保证返回的最终结果能被 32 位整数存下
使用递归,枚举出所有可能的情况。具体地,当我们处理到第 i 个数时,我们可以将它添加+或-,递归地搜索这两种情况。当我们处理完所有的 N 个数时,我们计算出所有数的和,并判断是否等于 S。
代码如下(C++):
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
return dfs(nums,S,0); // 深度优先搜索,枚举出所有结果。
}
int dfs(vector<int> &nums,uint target,int left){
if(target == 0 && left == nums.size()) return 1; // 目标为0并且遍历完了,返回一种方式
if(left >= nums.size()) return 0; // left大于数组长度,说明都遍历完了,但结果不对,返回0
int ans = 0;
ans += dfs(nums,target-nums[left],left+1); // 给第一个数添加减号,然后递归
ans += dfs(nums,target+nums[left],left+1); // 给第一个数添加加号,然后递归
return ans; // 得到所有方法
}
};
放在最后
如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~
更多精彩内容也可以访问我的博客Aelous-BLog