494. Target Sum 2018-04-19

两种解法。

494. Target Sum 2018-04-19_第1张图片
image.png
494. Target Sum 2018-04-19_第2张图片
image.png

格子中的数字,表示该解w[i][j]产生的可能组合数。
(# of ways to sum up to j using nums[0~i])
i: 取数组中前[0~i]个数;
j: sum up to j.

494. Target Sum 2018-04-19_第3张图片
DP

Java-java中冒号(:)的用法

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

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]);
//   }
// }

你可能感兴趣的:(494. Target Sum 2018-04-19)