494. Target Sum

1、題目html

  一、審題 數組

  

  

  二、分析spa

    給出一個正整數數組。爲每一個元素添加 + 、- 符號,而後將元素相加,求共有多少種組合使得和爲  S;code

 

2、解答htm

  方法1、blog

    ① 將此問題轉化爲取數組中若干元素,使得元素和爲某必定值的問題:get

    假設正數集合爲 P, 負數集合爲 N;則有:class

      sum[P] - sum[N] = S方法

      sum[P] + sum[N] + sum[P] - sum[N] = S + sum[nums]im

    即:

      sum[P] = (S + sum[nums]) / 2

 

    ② 求若干元素和爲特定值解法爲:  http://www.javashuo.com/article/p-totudbmk-gp.html

    ③ 採用一維整形動態數組: dp[s + 1]。 其中 dp[i]: 表示數組 nums 中元素隨意組合和 爲 i 的組合個數。

    ④ 最終返回 dp[s]

   public int findTargetSumWays(int[] nums, int s) {
        int sum = 0;
        for(int n : nums) 
            sum += n;
        
        if(sum < s || (s + sum) % 2 == 1)
            return 0;

        return subsetSum(nums, (s + sum) >>> 1);
    }
    
    private int subsetSum(int[] nums, int s) {
        int[] dp = new int[s + 1];
        dp[0] = 1;    // 在 nums 中取若干個元素求和,和爲 0 的組合共 1 個
        for(int n: nums) {
            for (int i = s; i >= n; i--) {
                dp[i] += dp[i - n];
            }
        }
        return dp[s];
    }
相關文章
相關標籤/搜索