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'+'
before2
and a'-'
before1
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
Post a Comment