LeetCode 494. 目标和

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

题目

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

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

示例:

输入: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。
 ```

提示:

数组非空,且长度不会超过 20 。
初始的数组的和不会超过 1000 。
保证返回的最终结果能被 32 位整数存下。

## 解题思路
def findTargetSumWays(self, nums: [int], S: int) -> int:
    # #递归 超时
    # if len(nums) == 1:
    #     if (nums[0] == S) or (-nums[0] == S):
    #         return 1
    #     else:
    #         return 0
    # if len(nums) == 2:
    #     ret = 0
    #     if (nums[0] + nums[1]) == S:
    #         ret = ret + 1
    #     if (nums[0] - nums[1]) == S:
    #         ret = ret + 1
    #     if (-nums[0] + nums[1]) == S:
    #         ret = ret + 1
    #     if (-nums[0] - nums[1]) == S:
    #         ret = ret + 1
    #     return ret
    # ret = self.findTargetSumWays(nums[:-1], S + nums[-1]) + self.findTargetSumWays(nums[:-1], S - nums[-1])
    # return ret
    #动态规划 背包问题,f[i] = f[i-1]+f[i+1]
    dataList = [{}for j in range(len(nums)+1)]#建立数据结构存储S对应的答案
    return self.findTargetSumWaysCore(nums, S, dataList)

def findTargetSumWaysCore(self, nums: [int], S: int, dataList:[int]) -> int:
    SDict = dataList[len(nums)]
    SStr = str(S)
    if SStr in SDict:
        # print("{} {} {}".format(nums,S, dataList[len(nums)][S]))
        return SDict[SStr]
    else:
        if len(nums) == 1:
            if (nums[0] == S) or (-nums[0] == S):
                dataList[len(nums)][SStr] = 1
                return 1
            else:
                return 0
        if len(nums) == 2:
            ret = 0
            if (nums[0] + nums[1]) == S:
                ret = ret + 1
            if (nums[0] - nums[1]) == S:
                ret = ret + 1
            if (-nums[0] + nums[1]) == S:
                ret = ret + 1
            if (-nums[0] - nums[1]) == S:
                ret = ret + 1
            dataList[len(nums)][SStr] = ret
            return ret
        ret = self.findTargetSumWaysCore(nums[:-1], S + nums[-1], dataList) + self.findTargetSumWaysCore(nums[:-1], S - nums[-1], dataList)
        dataList[len(nums)][SStr] = ret
        return ret
目录
相关文章
|
2月前
|
Python
【Leetcode刷题Python】494. 目标和
LeetCode 494题 "目标和" 的Python解决方案,通过动态规划算法计算在给定整数数组和目标值的情况下,可以构造多少种不同表达式使得运算结果等于目标值。
32 3
|
5月前
|
算法
【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品
【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品
|
4月前
【LeetCode刷题】有效三角形个数、查找总价值为目标值的两个商品
【LeetCode刷题】有效三角形个数、查找总价值为目标值的两个商品
|
5月前
|
算法
每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品
每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品
|
12月前
【Leetcode -733.图像渲染 -744.寻找比目标字母大的最小字母】
【Leetcode -733.图像渲染 -744.寻找比目标字母大的最小字母】
34 0
|
5月前
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
53 0
|
5月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
5月前
|
Go
golang力扣leetcode 494.目标和
golang力扣leetcode 494.目标和
50 0
|
5月前
|
Java
leetcode-494:目标和
leetcode-494:目标和
35 0
|
11月前
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
40 1