kim的每日刷题.LC.494.目标和

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

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

输入:nums: [1, 1, 1, 1, 1], S: 3
输出:5
输入:nums: [1, 0], S: 1
输出:2
输入:nums: [0, 0, 0, 0, 0, 0, 0, 0, 1], S: 1
输出:256

提示:

  • 数组非空,且长度不会超过 20 。
  • 初始的数组的和不会超过 1000 。
  • 保证返回的最终结果能被 32 位整数存下。
'''
动态规划:初始和不超过1000
时间:O(N*sum), N为数组长度, sum为目标和的范围
空间:O(N*sum)
'''
class Solution(object):
    def findTargetSumWays(self, nums, S):
        if S > 1000:
            return 0
        # 要考虑正数、负数、零,因此这里有1000的偏置项
        # dp[i][j]表示用前i个元素组成结果j的数目
        dp = [[0] * 2001 for _ in range(len(nums))]
        # 边界条件:第一个元素只使用一次+-符号组成结果j数目为1
        dp[0][nums[0] + 1000] = 1
        # 当nums[0]==0时,dp[0][0+1000]应该为2,而不是被赋值为1
        dp[0][-nums[0] + 1000] += 1
        for i in range(len(nums)-1):
            for sums in range(-1000, 1001, 1):
                if dp[i][sums + 1000] > 0:
                    dp[i+1][sums + nums[i+1] + 1000] += dp[i][sums + 1000]
                    dp[i+1][sums - nums[i+1] + 1000] += dp[i][sums + 1000]
        return dp[-1][S + 1000]

 这里构造DP数组:dp[i][j]表示用前 i 个元素组成结果 j 的数目

注意初始化DP数组时要考虑nums[0] == 0的情况

理解递推:构成“sums + nums[i+1] + 1000”或者“sums - nums[i+1] + 1000”结果,需要累加构成“sums + 1000”结果的数目

dp[i+1][sums + nums[i+1] + 1000] += dp[i][sums + 1000]
dp[i+1][sums - nums[i+1] + 1000] += dp[i][sums + 1000]

理解判断条件:只有当存在一些能够构成“sums + 1000”这个结果的运算组合时,才能由这个“sums + 1000”运算结果组合成其他新的结果;

if dp[i][sums + 1000] > 0:

从labuladong的算法小抄中看到很有意思的框架,贴在这里。。。

for 状态1 in 状态1的所有取值:
    for 状态2 in 状态2的所有取值:
        for ...
            dp[状态1][状态2][...] = 择优(选择1, 选择2...)

在这里例子中:状态1遍历了整个nums列表中的每一个item;状态2考虑了所有可能存在的运算结果;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《快速傅里叶变换:算法》是k.r.rao、d.n.kim和j.j.hwang在1974年提出的一个重要的信号处理算法。傅里叶变换是一种将一个信号在时间域和频率域之间相互转换的数学工具,能够将一个信号分解成多个不同频率的正弦和余弦波的叠加。然而,传统的傅里叶变换算法计算量大,对于大规模数据处理效率较低。 《快速傅里叶变换:算法》通过巧妙的求解方法,成功地提高了傅里叶变换的计算速度。它利用了傅里叶变换的对称性和周期性,将一个长度为N的离散信号序列的傅里叶变换从O(N^2)的复杂度减少到了O(NlogN)的复杂度。该算法以时间分解和频率分解为基础,通过递归的方式把一个长度为N的序列分解成多个长度为N/2的子序列。然后,将这些子序列进行DFT(离散傅里叶变换)计算,最终得到整个序列的傅里叶变换。 这个算法的创新之处在于它将傅里叶变换的计算过程分解成了多个小规模的子问,通过递归的方式进行计算,从而大大提高了计算的效率。该算法不仅被广泛应用于信号处理领域,例如图像处理、音频处理和视频压缩等,而且还在计算机科学领域的算法设计有着重要的应用。 《快速傅里叶变换:算法》的提出为大规模信号处理和数据压缩提供了重要的工具。通过使用该算法,我们可以更加高效地进行傅里叶变换的计算,从而加快信号处理的速度,提升系统的性能。在现代科技的发展,《快速傅里叶变换:算法》的应用正日益广泛,对于促进科技创新和社会进步发挥着重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值