欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 494.目标和(中等)

程序员文章站 2024-03-15 09:00:47
...

题目描述:

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。
对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例 1:
输入: 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。

实现:

LeetCode 494.目标和(中等)

#思路:DFS+记忆化+剪枝

class Solution:
    def findTargetSumWays(self, nums: List[int], S: int) -> int:
        if not nums:return 0
        dp={}
        res=self.helper(nums,S,0,0,dp)
        return res
        
    def helper(self,nums,S,i,sums,dp):
        if i<len(nums) and (i,sums) not in dp:
            cnt1=self.helper(nums,S,i+1,sums+nums[i],dp)    #左叶子节点
            cnt2=self.helper(nums,S,i+1,sums-nums[i],dp)    #右叶子节点
            dp[(i,sums)]=cnt1+cnt2
        return dp.get((i,sums),S==sums)