给你一个整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。输入:nums = [1,1,1,1,1], target = 3 输出:5 解释:一共有 5 种方法让最终目标和为 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
+1 + 1 + 1 + 1 - 1 = 3
此题不用动态规划思路的话,常规思路显然是判断数组和是否为target,是则计数,但是数组是有顺序的,相同的值对于不同位置也是不同的,所以我自然想到深度优先遍历。
则遍历终止条件为数组所有值都遍历完,则index可以用来记是否遍历完,index则作为参数在递归中传递。
if(index==nums.length)
终止递归之后判断数组和是否等于target,则数组和用sum表示,sum也作为参数在递归中循环
public void dfs(int[] nums,int target,int index,int sum)
每一次向深度遍历时,都有加 减两种情况
dfs(nums, target, index+1, sum+nums[index]);
dfs(nums, target, index+1, sum-nums[index]);
完整代码为:
class Solution {
int count=0;
public int findTargetSumWays(int[] nums, int target) {
dfs(nums,target,0,0);
return count;
}
public void dfs(int[] nums,int target,int index,int sum){
//递归终止条件
if(index==nums.length){
//递归到终点时判断是否等于target
if(sum==target){
count++;
}
}else{
//深度遍历
dfs(nums, target, index+1, sum+nums[index]);
dfs(nums, target, index+1, sum-nums[index]);
}
}
}