1 题目

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 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
+1 + 1 + 1 + 1 - 1 = 3

示例 2:

输入:nums = [1], target = 1
输出:1

2 解析

0-1背包问题
记数组的元素和为s,是所有负数的和是neg,则正数的和为s−neg,得到的表达式的结果为
(s−neg)−neg=s−2⋅neg=target(s−neg)−neg=s−2⋅neg=target(s−neg)−neg=s−2⋅neg=target


neg=s−target2\textit{neg}=\dfrac{\textit{s}-\textit{target}}{2}neg=2s−target​

由于数组nums 中的元素都是非负整数,neg 也必须是非负整数,所以上式成立的前提是 s−target 是非负偶数。若不符合该条件可直接返回 0。即
diff=s−targetdiff>0,diff%2==0diff = s-target\\diff>0 ,diff\%2 ==0 diff=s−targetdiff>0,diff%2==0

若上式成立,问题转化成在数组nums 中选取若干元素,使得这些元素之和等于neg,计算选取元素的方案数。我们可以使用动态规划的方法求解。转化为leetcode 518. 零钱兑换 II

3 python实现

class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:diff = sum(nums)-targetif diff<0 or diff%2:return 0neg = int(diff/2)dp = [1]+[0]*negfor num in nums:for j in  range(neg,num-1,-1):dp[j]+=dp[j-num]return dp[-1]

【Leetcode刷题Python】494. 目标和相关推荐

  1. LeetCode刷题Python实录

    使用Python的LeetCode刷题 前言 题目 1408. 数组中的字符串匹配 508. 出现次数最多的子树元素和 1089. 复写零 剑指 Offer 14- I. 剪绳子 1175. 质数排列 ...

  2. 【Leetcode刷题Python】40. 组合总和 II

    1 题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每 ...

  3. 【Leetcode刷题Python】516. 最长回文子序列

    1 题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度. 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列. 示例 1: 输入:s = &q ...

  4. 【代码】LeetCode刷题Python版

    python版LeetCode 算法部分 811. 子域名访问计数 class Solution:def subdomainVisits(self, cpdomains):""&q ...

  5. 【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费

    1 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付手续费.如果你已经 ...

  6. 【Leetcode刷题Python】55. 跳跃游戏

    1 题目 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个下标. 示例 1: 输入:nums = [2 ...

  7. 【Leetcode刷题Python】生词本单词整理

    1 题目 小A最近在努力学习英语.小A有一本生词本,专门用来记录见到的生词.每次小A看到一个自己不认识的单词时,就会把这个生词抄写到生词本上.经过几个月的学习之后,小A想对这个生词本上的单词进行整理. ...

  8. 【Leetcode刷题Python】416. 分割等和子集

    1 题目 给你一个 只包含正整数 的 非空 数组 nums .请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 示例 1: 输入:nums = [1,5,11,5] 输出:true ...

  9. 【Leetcode刷题Python】174. 地下城游戏

    1 题目 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. ...

最新文章

  1. SAP物料移动过账之差异科目
  2. 深入了解WM_SIZE
  3. java 调用父类的变量_java创建子类对象设置并调用父类的变量操作
  4. Amazon Redshift数据库
  5. 微服务~Eureka实现的服务注册与发现及服务之间的调用
  6. 能运行shell吗_terminal, shell, bash, zsh
  7. ElementUI实现表单校验
  8. L298N模块详细使用教程
  9. PL/SQL中导出整个表、表结构、部分数据、以及导入整个表
  10. 项目实施过程中的风险控制
  11. 谷歌浏览器好用的插件
  12. 蓝桥杯真题 - 费解的开关题解
  13. SQL SERVER 软件和安装步骤
  14. 项目使用的 safe.cs 帮助类
  15. MYSQL —(二)筛选、聚合和分组、查询
  16. BUC算法简介与python实现
  17. 人工智能是研究开发能够模拟、延伸和扩展人类智能的技术
  18. 如何才能让手机厂商主动拥抱华为,接入鸿蒙系统?
  19. 深度学习——车道线检测
  20. 使用轮询方式进行ADC转换(野火STM32 MINI开发板)

热门文章

  1. Vue SSR 从入门到 Case Study
  2. C语言队列函数中pop,C语言_队列的基本操作
  3. 考研的利弊分析:什么人和专业适合考研?
  4. uniapp-ThorUi下拉框出现出现的问题
  5. ChatGPT教程之 02 ChatGPT 正在经历托马斯爱迪生的时刻,为什么需要获得突破性技术
  6. 江南大学计算机专业就业率,江南大学这些本科和硕士专业就业率100%!2019江大毕业生就业报告...
  7. 如果格局决定了人生,那么到底什么决定了格局?
  8. 四、VUE基础学习篇(循环v-for)- v-for、v-bind:key
  9. 作为程序员的你 是喜欢代码还是喜欢工作 ?
  10. 如何在Win10下,清空剪贴板