1. 程式人生 > >494 Target Sum 目標和

494 Target Sum 目標和

uno ret AC 添加 subsets div sta 並且 AI

給定一個非負整數數組,a1, a2, ..., an, 和一個目標數,S。現在你有兩個符號 + 和 -。對於數組中的任意一個整數,你都可以從 + 或 -中選擇一個符號添加在前面。
返回可以使最終數組和為目標數 S 的所有添加符號的方法數。
示例 1:
輸入: nums: [1, 1, 1, 1, 1], S: 3
輸出: 5
解釋:
-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
一共有5種方法讓最終目標和為3。
註意:
1.數組的長度不會超過20,並且數組中的值全為正數。
2.初始的數組的和不會超過1000。
3.保證返回的最終結果為32位整數。
詳見:https://leetcode.com/problems/target-sum/description/

C++:

方法一:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int res=0;
        helper(nums,S,0,res);
        return res;
    }
    void helper(vector<int> &nums,int S,int start,int &res)
    {
        if(start>=nums.size())
        {
            if(S==0)
            {
                ++res;
            }
            return;
        }
        helper(nums,S-nums[start],start+1,res);
        helper(nums,S+nums[start],start+1,res);
    }
};

方法二:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) 
    {
        int n = nums.size();
        vector<unordered_map<int, int>> dp(n + 1);
        dp[0][0] = 1;
        for (int i = 0; i < n; ++i)
        {
            for (auto &a : dp[i])
            {
                int sum = a.first, cnt = a.second;
                dp[i + 1][sum + nums[i]] += cnt;
                dp[i + 1][sum - nums[i]] += cnt;
            }
        }
        return dp[n][S];
    }
};

方法三:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int sum=std::accumulate(nums.begin(),nums.end(),0);
        return sum<S||(sum+S)&1?0:subSetsum(nums,(sum+S)>>1);
    }
    int subSetsum(vector<int>& nums, int s){
        int dp[s+1]={0};
        dp[0]=1;
        for(int num:nums)
        {
            for(int i=s;i>=num;i--)
            {
                dp[i]+=dp[i-num];
            }
        }
        return dp[s];
    }
};

參考:https://www.cnblogs.com/grandyang/p/6395843.html?utm_source=itdadao&utm_medium=referral

https://blog.csdn.net/hit0803107/article/details/54894227

494 Target Sum 目標和