目标和
给你一个整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
示例 1:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 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
+1 + 1 + 1 + 1 - 1 = 3
示例 2:
输入:nums = [1], target = 1
输出:1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/target-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
//获取最大值
for(int num : nums) sum += num;
//排除特殊条件
if ((sum + target) % 2 == 1 || Math.abs(target) > sum) return 0;
//动态数组长度
int dpLen = sum * 2 + 1;
//动态数组数据初始化第一行
int[][] dp = new int[nums.length][dpLen];
if(nums[0]==0){
dp[0][sum]=2;
}
else{
dp[0][sum+nums[0]]=1;
dp[0][sum-nums[0]]=1;
}
//动态数组数据构造剩余数据
for(int i=1;i<nums.length;i++){
for(int j=0;j<dpLen;j++){
//当前格子的数据为左右上方的格子相加
//不在表格内的情况为0,在表格取表格值
int l = j-nums[i] >=0 ? j-nums[i]:0;
int r = j+nums[i] < dpLen ? j+nums[i]:0;
dp[i][j] = dp[i-1][l] + dp[i-1][r];
}
}
//返回结果对应值
return dp[nums.length-1][sum+target];
}
}

浙公网安备 33010602011771号