494.目標和
阿新 • • 發佈:2018-12-26
給定一個非負整數陣列,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。
注意:
- 陣列的長度不會超過20,並且陣列中的值全為正數。
- 初始的陣列的和不會超過1000。
- 保證返回的最終結果為32位整數。
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
vector<unordered_map<int, int>> dp(nums.size());
return helper(nums, S, 0, dp);
}
int helper(vector<int>& nums, int sum, int start, vector<unordered_map<int, int>>& dp) {
if (start == nums.size()) return sum == 0;
if (dp[start].count(sum)) return dp[start][sum];
int cnt1 = helper(nums, sum - nums[start], start + 1, dp);
int cnt2 = helper(nums, sum + nums[start], start + 1, dp);
return dp[start][sum] = cnt1 + cnt2;
}
};