美文网首页
494. Target Sum 2018-04-19

494. Target Sum 2018-04-19

作者: 程序猪小羊 | 来源:发表于2018-04-20 08:01 被阅读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]);
    //   }
    // }
    

    相关文章

      网友评论

          本文标题:494. Target Sum 2018-04-19

          本文链接:https://www.haomeiwen.com/subject/hxmokftx.html