494 Target Sum 目標和
阿新 • • 發佈:2018-04-22
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 目標和