两种解法。
image.png image.png格子中的数字,表示该解w[i][j]产生的可能组合数。
(# of ways to sum up to j using nums[0~i])
i: 取数组中前[0~i]个数;
j: sum up to j.
String[] abc = new String[3]{"a","b","c"};
for (String str : abc){
System.out.println(str); //这个地方的冒号就是遍历abc的集合,取出每一个元素
}
DP
遍历所有的+/-,最后 check sum == target?
public class Solution {
public int findTargetSumWays(int[] nums, int s) {
int sum = 0;
for(int i: nums) sum+=i;
if(s>sum || s<-sum) return 0;
int[] dp = new int[2*sum+1];
dp[0+sum] = 1;
for(int i = 0; i<nums.length; i++){
int[] next = new int[2*sum+1];
for(int k = 0; k<2*sum+1; k++){
if(dp[k]!=0){
next[k + nums[i]] += dp[k];
next[k - nums[i]] += dp[k];
}
}
dp = next;
}
return dp[sum+s];
}
}
DFS
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 sum, int S) {
if (i == nums.length) { // # of elements used
if (sum == S)
count++;
} else {
calculate(nums, i + 1, sum + nums[i], S);
calculate(nums, i + 1, sum - nums[i], S);
}
}
}
// class Solution {
// private int ans;
// public int findTargetSumWays(int[] nums, int S) {
// int sum = 0;
// for (final int num : nums)
// sum += num;
// if (sum < Math.abs(S)) return 0;
// ans = 0;
// dfs(nums, 0, S);
// return ans;
// }
// private void dfs(int[] nums, int d, int S) {
// if (d == nums.length) {
// if (S == 0) ++ans;
// return;
// }
// dfs(nums, d + 1, S - nums[d]);
// dfs(nums, d + 1, S + nums[d]);
// }
// }
网友评论