LeetCode 494.目标和 - C++ - 深度优先搜索(DFS)

目标和

给定一个非负整数数组,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& nums, int S) {
        return dfs(nums,S,0);   // 深度优先搜索,枚举出所有结果。
    }
    int dfs(vector &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

你可能感兴趣的:(LeetCode)