目标和
问题陈述
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 输入: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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution{ int count=0; public int findTargetSumWays(int[] nums,int s){ calculate(nums,0,0,s); return count; } public void calculate(int[] nums,int i,int num,int s){ if(i==nums.length){ if(num==s){ count++; } }else{ calculate(nums,i+1,num+nums[i],s); calculate(nums,i+1,num-nums[i],s); } } }
|
方法二:回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class Solution{ int result = 0;
int findTargetSumWays(int[] nums, int target) { if (nums.length == 0) return 0; backtrack(nums, 0, target); return result; }
void backtrack(int[] nums, int i, int rest) { if (i == nums.length) { if (rest == 0) { result++; } return; } rest += nums[i]; backtrack(nums, i + 1, rest); rest -= nums[i];
rest -= nums[i]; backtrack(nums, i + 1, rest); rest += nums[i]; } }
|