栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【LeetCode】494. 目标和

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【LeetCode】494. 目标和

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 动态规划
~
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号