佇列&棧//目標和
阿新 • • 發佈:2018-11-13
給定一個非負整數陣列,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(int[] nums, int S) { int sum = 0; int n = nums.length; for(int i = 0; i < n; i++){ sum += nums[i]; } if(S>sum||(sum+S)%2!=0) return 0; int t =(sum+S)/2; int[] dp = new int[t+1]; dp[0] = 1; for(int i = 0; i < n; i++){ for(int j = t; j >= nums[i]; j--){ dp[j]+=dp[j-nums[i]]; } } return dp[t]; } }
class Solution { public: int findTargetSumWays(vector<int>& nums, int S) { unordered_map<int,int> dp; dp[0] = 1; for(int num:nums){ unordered_map<int,int> t; for(auto a:dp){ int sum = a.first, cnt = a.second; t[sum+num]+=cnt; t[sum-num]+=cnt; } dp = t; } return dp[S]; } };
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);
}
};