1.递归
class Solution {
public:
int count=0;
int findTargetSumWays(vector<int>& nums, int S) {
calculate(nums,0,0,S);
return count;
}
void calculate(vector<int> nums,int i,int sum,int S){
if(i==nums.size()) {
if(sum==S) count++;
}else {
calculate(nums,i+1,sum+nums[i],S);
calculate(nums,i+1,sum-nums[i],S);
}
}
};
时间复杂度:O(2^N)
超时
2.动态规划
这道题的关键不是nums[i]的选与不选,而是nums[i]是加还是减,那么我们就可以将方程定义为:dp[i][j]=dp[i-1][j-nums[i]]+dp[i-1][j+nums[i]]
也可以写成递推的形式:
dp[i][j + nums[i]] += dp[i - 1][j]
dp[i][j - nums[i]] += dp[i - 1][j]
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int dp[nums.size()][2001];
memset(dp,0,sizeof(dp));
dp[0][nums[0]+1000]=1;
dp[0][-nums[0]+1000]+=1;
for(int i=1;i<nums.size();i++){
for(int sum=-1000;sum<=1000;sum++){
if(dp[i-1][sum+1000]>0) {
dp[i][sum+nums[i]+1000]+=dp[i-1][sum+1000];
dp[i][sum-nums[i]+1000]+=dp[i-1][sum+1000]; }
}
}
return S>1000?0:dp[nums.size()-1][S+1000];
}
};
时间复杂度:O(N∗sum)