美文网首页
LeetCode 494. 目标和

LeetCode 494. 目标和

作者: 草莓桃子酪酪 | 来源:发表于2022-07-05 04:13 被阅读0次
题目

给你一个整数数组 nums 和一个整数 target。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个表达式:

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同表达式的数目。

例:
输入: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

方法:动态规划

按照之前的思路,应该将数组 nums 分割成两部分,一部分作为减数,另一部分作为被减数,两组元素相减得到 target

  • sumValue 表示数组 nums 所有元素和
  • 若目标和 target 的绝对值大于数组的所有元素和 sumValue,即所有元素相加或相减仍达不到 target,则表示表达式的数目一定为零;若两组元素的差无论怎样均无法得到 target,则表示表达式的数目一定为零
  • bagSize 表示减数
  • dp[j] 表示填满容量为 j 的背包,有 dp[j] 种方法。初始化 dp[0] 为 1,表示想要填满容量为零的背包,共有一种方法
  • 外部循环,对数组进行正序遍历;内部循环,对背包容量进行倒序遍历
  • 递推公式:因为求的是不同表达式的数目,所以应该把所有的可能性相加


class Solution(object):
    def findTargetSumWays(self, nums, target):
        sumValue = sum(nums)
        if abs(target) > sumValue or (sumValue + target) % 2 == 1:
            return 0
        bagSize = (sumValue + target) // 2
        dp = [0] * (bagSize + 1)
        dp[0] = 1
        for i in range(len(nums)):
            for j in range(bagSize, nums[i] - 1, -1):
                dp[j] += dp[j-nums[i]]
        return dp[bagSize]

例:
nums = [1,1,1,1,1], target = 3

参考

代码相关:https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html

相关文章

网友评论

      本文标题:LeetCode 494. 目标和

      本文链接:https://www.haomeiwen.com/subject/untdbrtx.html