494. Target Sum 2018-04-19

2018-04-20  本文已影响19人  程序猪小羊

两种解法。

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.

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<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]);
//   }
// }
上一篇下一篇

猜你喜欢

热点阅读