题目描述
给定一个非负整数数组,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。
解题思路
回溯法
static int result = 0;
/**
* 回溯法
*/
static int findTargetSumWays_1(int[] nums, int target){
if (nums.length == 0)
return 0;
backtrack(nums,0,target);
return result;
}
private static void backtrack(int[] nums, int i, int rest) {
//base case
if(i == nums.length){
if (rest == 0){
//说明恰好凑出target
result++;
}
return;
}
//给nums[i] 选择 - 号
rest += nums[i];
//穷举nums[i+1]
backtrack(nums, i+1, rest);
//撤销选择
rest -= nums[i];
//给nums[i]选择 + 号
rest -= nums[i];
//穷举nums[i+1]
backtrack(nums,i+1,rest);
//撤销选择
rest += nums[