目标和

给你一个整数数组 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];
    }
}
posted @ 2022-12-20 23:12  网抑云黑胶SVIP用户  阅读(29)  评论(0)    收藏  举报