494. Target Sum

You are given an integer array nums and an integer target.

You want to build an expression out of nums by adding one of the symbols '+' and '-' before each integer in nums and then concatenate all the integers.

  • For example, if nums = [2, 1], you can add a '+' before 2 and a '-' before 1 and concatenate them to build the expression "+2-1".

Return the number of different expressions that you can build, which evaluates to target.

 Example 1:

Input: nums = [1,1,1,1,1], target = 3
Output: 5
Explanation: There are 5 ways to assign symbols to make the sum of nums be target 3.
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

Example 2:

Input: nums = [1], target = 1
Output: 1

 Constraints:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 1000
  • 0 <= sum(nums[i]) <= 1000
  • -1000 <= target <= 1000

Solutions

Dynamic programming.

It is similar to the 0-1 Knapsack problem, except that the index may appear negative, which requires special handling.

C++

  • class Solution {
    public:
        int findTargetSumWays(vector<int>& nums, int target) {
            int s = accumulate(nums.begin(), nums.end(), 0);
            if (s < target || (s - target) % 2 != 0) return 0;
            int n = (s - target) / 2;
            vector<int> dp(n + 1);
            dp[0] = 1;
            for (int& v : nums)
                for (int j = n; j >= v; --j)
                    dp[j] += dp[j - v];
            return dp[n];
        }
    };

JAVA

  • class Solution {
        public int findTargetSumWays(int[] nums, int target) {
            int s = 0;
            for (int v : nums) {
                s += v;
            }
            if (s < target || (s - target) % 2 != 0) {
                return 0;
            }
            int n = (s - target) / 2;
            int[] dp = new int[n + 1];
            dp[0] = 1;
            for (int v : nums) {
                for (int j = n; j >= v; --j) {
                    dp[j] += dp[j - v];
                }
            }
            return dp[n];
        }
    }

PYTHON

  • class Solution {
    public:
        int findTargetSumWays(vector<int>& nums, int target) {
            int s = accumulate(nums.begin(), nums.end(), 0);
            if (s < target || (s - target) % 2 != 0) return 0;
            int n = (s - target) / 2;
            vector<int> dp(n + 1);
            dp[0] = 1;
            for (int& v : nums)
                for (int j = n; j >= v; --j)
                    dp[j] += dp[j - v];
            return dp[n];
        }
    };

Comments