目标和—leetcode494
生活随笔
收集整理的這篇文章主要介紹了
目标和—leetcode494
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
給定一個非負整數(shù)數(shù)組,a1, a2, ..., an, 和一個目標數(shù),S。現(xiàn)在你有兩個符號?+?和?-。對于數(shù)組中的任意一個整數(shù),你都可以從?+?或?-中選擇一個符號添加在前面。
返回可以使最終數(shù)組和為目標數(shù) S 的所有添加符號的方法數(shù)。
示例:
輸入: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。提示:
- 數(shù)組非空,且長度不會超過 20 。
- 初始的數(shù)組的和不會超過 1000 。
- 保證返回的最終結(jié)果能被 32 位整數(shù)存下。
?方法一:DFS暴力搜索
?
class Solution { public:int findTargetSumWays(vector<int>& nums, int S) {int N=nums.size();int sum=0,result=0;DFS(nums,0,N,S,sum,result);return result;}void DFS(vector<int>& nums,int index,int N,int S,int sum,int &result){if(index==N){if(sum==S){result++;}return;}DFS(nums,index+1,N,S,sum+nums[index],result);DFS(nums,index+1,N,S,sum-nums[index],result);return;} };方法二:動態(tài)規(guī)劃
class Solution { public:int findTargetSumWays(vector<int>& nums, int S) {//第一步將所有元素進行求和long long sum = 0;for(int num : nums){sum += num;}//sum代表的含義是選擇所有物品,[+,+,+...+],因為所有物品都是加號//S代表的所有物品求和去除某些物品的兩倍,[+,+,-,-,+....-],負號的物品不但不選還需要重背包中取出同樣重量的物品//sum + S代表的是S中選擇的物品選擇兩次,(S中負號物品與sum中對應的正號物品抵消,剩下的正號物品選擇了兩次)long long myS = sum + S;if (sum < S || myS % 2 == 1){//剪枝return 0;}myS = myS / 2;//現(xiàn)在就是需要確定總重量為myS的情況數(shù)vector<int> dp(myS + 1,0);//dp[i]代表的是湊出重量為i的情況數(shù)dp[0] = 1;//進行動態(tài)規(guī)劃for(int num : nums){for(int i = myS; i >= num; --i){dp[i] += dp[i-num];} } return dp[myS];} };?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結(jié)
以上是生活随笔為你收集整理的目标和—leetcode494的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Resize源码详解(参考Opencv4
- 下一篇: 剑指offer--不用加减乘除做加法