zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【LeetCode】494. 目标和

LeetCode 目标
2023-09-14 09:13:24 时间

0.总结

  • 本题难点在于抽象的能力,如何将本题抽象成一道动态规划题是关键。

1.题目

2.思想

2.1 深搜 + 剪枝

  • (1)每个整数前只能加一个符号,每次都有两种选择
  • (2)将得到的数字求和,判断是否可以得到想要的结果target
  • (3)根据条件判断当前这个节点是否值得深搜

可惜的是,这个python下的代码过不完测试样例。

2.2 动态规划

初看题解,本题竟然还可以使用动态规划?!我是大大的震惊!但是这些题目考的就是抽象的分析能力,难点在于如何将本道题转换成一个动态规划需要解决的题?于是有了下面这段分析。

3.代码

3.1 深搜+剪枝

下面这个代码的ac情况如下:
在这里插入图片描述

class Solution:
    def __init__(self):
        self.res = 0
    def findTargetSumWays(self, nums: List[int], target: int) -> int:        
        post_sum = [0] * (len(nums)+1) # 记录后n项和
        for i in reversed(range(len(nums))):
            post_sum[i] = post_sum[i+1] + nums[i]
        # print(post_sum)
        # 当前正在访问第idx个元素
        self.dfs(target,nums,idx=0,tmp=[],post_sum=post_sum)
        return self.res

    # idx 表示当前正在访问的下标数字
    def dfs(self,target,nums,idx,tmp,post_sum):
        # 剪枝
        # 如果当前的和减去
        if sum(tmp) - post_sum[idx]  > target:
            return
        if sum(tmp) + post_sum[idx]  < target:
            return
        
        if idx==len(nums) :
            # print(tmp)
            if sum(tmp) == target:
                self.res += 1
            return 

        # 修改为+
        tmp.append(nums[idx])
        self.dfs(target,nums,idx+1,tmp,post_sum)
        tmp.pop()        
        
        # 修改为-
        tmp.append(-nums[idx])
        self.dfs(target,nums,idx+1,tmp,post_sum)
        tmp.pop()

'''
[16,40,9,17,49,32,30,10,38,36,31,22,3,36,32,2,26,17,30,47]
49
'''

3.2 动态规划

~