给定一个非负整数数组,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。

注意:

  1. 数组的长度不会超过20,并且数组中的值全为正数。
  2. 初始的数组的和不会超过1000。
  3. 保证返回的最终结果为32位整数。

 

 

//章节 - 队列和栈    
//四、栈和深度优先搜索
//3.目标和
/*
算法思想:
    使用递归,也就DFS,只是用的系统栈。我们从第一个数字,调用递归函数,在递归函数中,分别对目标值进行加上当前数字调用递归,和减去当前数字调用递归,这样会涵盖所有情况,并且当所有数字遍历完成后,我们看若目标值为0了,则结果res自增1,
*/
//算法实现:
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int res = 0;
        helper(nums, S, 0, res);
        return res;
    }
    void helper(vector<int>& nums, int S, int start, int& res) {
        if (start >= nums.size()) {
            if (S == 0) 
                ++res;
            return;
        }
        helper(nums, S - nums[start], start + 1, res);
        helper(nums, S + nums[start], start + 1, res);
    }
};

 

相关文章:

  • 2021-12-24
  • 2022-12-23
  • 2021-12-03
  • 2021-06-02
  • 2021-11-16
  • 2021-10-24
  • 2021-07-10
  • 2022-01-13
猜你喜欢
  • 2022-12-23
  • 2021-10-07
  • 2021-12-09
  • 2021-12-25
  • 2021-11-11
  • 2021-08-26
  • 2022-12-23
相关资源
相似解决方案