Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)

Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)

深度优先搜索的解题详细介绍,点击


 

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


分析:
要求给数组每个数字加+或者-,使最后的表达式的值为S。
那我们可以换个思路想,把这些全部先加起来,我们只需要加减号就可以了。
例如图中的例子 sum=5,那如果我要添加一个减号的话,sum需要减2倍的nums[i]

DFS解决,加减号或者不加减号。

class Solution {
    int ans = 0;
    public int findTargetSumWays(int[] nums, int S) {
        if (nums.length == 0)
            return 0;
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        Arrays.sort(nums);
        dfs(nums, nums.length - 1, S, sum);
        return ans;
    }
    
    public void dfs(int[] nums, int step, int S, int sum) {
        if (step < 0) {
            if (sum == S) {
                ans++;
            }
            return;
        }
        if (sum < S) {
            return;
        }
        dfs(nums, step - 1, S, sum - (2 * nums[step]));
        dfs(nums, step - 1, S, sum);

    }
}

 



posted @ 2019-08-13 00:48  秦羽纶  阅读(440)  评论(0编辑  收藏  举报