LeetCode | 494. Target Sum

题目

ou 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

代码

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        if(accumulate(nums.begin(), nums.end(), 0)<S)
            return 0;
        
        int ofs = 2017;
        vector<vector<int>> dp(2, vector<int>(S+ofs*2+5));
		
		dp[0][ofs+nums[0]] = dp[0][ofs-nums[0]] = 1;
		for(int i = 1; i<nums.size(); i++){
			for(int j=-1000; j<=S+1000; j++){
				int idx = i%2;
				int before = (idx+1)%2;
				dp[idx][j+ofs] = dp[before][j-nums[i]+ofs] + dp[before][j+nums[i]+ofs];
			}
		}
		
		return nums[0]==0 ? dp[(nums.size()-1)%2][S+ofs]*2:dp[(nums.size()-1)%2][S+ofs];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值