第一种思路:全部遍历。复杂度为O(2^n)
public class Solution {
private int res = 0;
public int findTargetSumWays(int[] nums, int S) {
calculate(nums, 0, 0, S);
return res;
}
private void calculate(int[] nums, int i, int sum, int target) {
if (i == nums.length) {
if (sum == target) {
res++;
}
} else {
calculate(nums, i + 1, sum + nums[i], target);
calculate(nums, i + 1, sum - nums[i], target);
}
}
}
第二种思路:
转化成0-1背包客问题
public class Solution {
public int findTargetSumWays(int[] nums, int S) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if (sum < S || sum < (-1 * S)) return 0;
if ((S + sum) % 2 == 1) return 0;
int target = (S + sum) / 2;
int[] arr = new int[target + 1];
arr[0] = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = target; j >= nums[i]; j--) {
arr[j] = arr[j] + arr[j - nums[i]];
}
}
return arr[target];
}
}