JavaScript|LeetCode|动态规划/递归|494. 目标和

LeetCode 目标和(深度优先搜索+动态规划) 给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例 1: 输入: nums: [1, 1, 1, 1, 1], S: 3 输出: 5 解释: -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+... 阅读详情

法1:动态规划
看了题解
想法:

  1. 思考:什么是背包?什么是物品?
  • 将nums分为P(加+)和N(加-)两部分
  • sums( P ) + sums( N ) = sums(nums)
  • sums( P ) - sums( N ) = S
  • => sums( P ) = (sums(nums) + S) / 2
  • 则只需要选取数组中元素加入背包(这些数前面加+),使得背包正好被装满;求装满的方法数
  1. 数组dp表示:选取nums中元素加入背包中,元素之和等于 i 的选取的方法数
/** 
* @param {number[]} nums 
* @param {number} S 
* @return {number} 
*/
var findTargetSumWays = function(nums, S) {    
    // 思考:什么是背包?什么是物品?    
    // 将nums分为P(加+)和N(加-)两部分    
    // sums(P) + sums(N) = sums(nums)    
    // sums(P) - sums(N) = S    
    // => sums(P) = (sums(nums) + S) / 2    
    // 则只需要选取数组中元素加入背包(这些数前面加+),使得背包正好被装满;求装满的方法数
    var dp = [], i = 0, j = 0, sum = 0, W = 0; 
    // dp表示有几种方式使得和为i;W为背包容量    

    for(i = 0; i < nums.length; i++) {        
        sum += nums[i];    
    }    
    W = (sum + S) / 2;
    
    // 如果W不是整数,则方法数为0    
    // 若目标和大于全部整数为正时候的和,则方法数为0    
    if(Math.floor(W) != W || S > sum) {         
        return 0;    
    }    
    for(i = 0; i <= W; i++) {        
        dp[i] = 0;    
    }    
    dp[0] = 1; // 容量为0的背包:不在背包里放东西,则能够使得背包“装满” => 一种方法数
    
    for(i = 0; i < nums.length; i++) { // 对于nums中每个数字(物品)        
        for(j = W; j >= nums[i]; j--) {            
            dp[j] += dp[j - nums[i]]; // dp[j - nums[i]]:将当前物品装入之后,剩余空间的可能组合数        
        }    
    }    
    return dp[W];
};

法2:递归
看了题解
想法:

  1. 递归结束条件:若数组为空,则:S == 0时,方法数为1,否则方法数为0
  2. 对于数组的第一个数nums[0],有可能在前面加 - 或 +,则:
  • S = -nums[0] + 剩余的数 => S + nums[0] = 剩余的数
  • S = +nums[0] + 剩余的数 => S - nums[0] = 剩余的数
    上面两种可能性,表示父节点的两个子节点(两种走向)
/** 
* @param {number[]} nums 
* @param {number} S 
* @return {number} 
*/
var findTargetSumWays = function(nums, S) {    
    // 递归结束条件:若数组为空,则:S == 0时,方法数为1,否则方法数为0    
    // 对于数组的第一个数nums[0],有可能在前面加 - 或 +,则:    
    // S = -nums[0] + 剩余的数    
    // S + nums[0] = 剩余的数    
    // S = +nums[0] + 剩余的数    
    // S - nums[0] = 剩余的数    
    // 上面两种可能性,表示父节点的两个子节点(两种走向)    
    return findTargetSumWays2(nums, 0, S);
};

function findTargetSumWays2(nums, start, S) {    
    if(start == nums.length) {        
        return S == 0 ? 1 : 0;    
    }    
    return findTargetSumWays2(nums, start + 1, S + nums[start]) +         
        findTargetSumWays2(nums, start + 1, S - nums[start]);
}
JavaScript|LeetCode|动态规划|714. 买卖股票的最佳时机含手续费 法1:动态规划 想法: 数组dp保存每一天的利润最大值 在第 i 天,对于第 j (j < i)天的股票:dp[i]=Math.max(dp[i],dp[j]+prices[i]−prices[j]−fee,dp[j])dp[i] = Math.max(dp[i], dp[j] + prices[i] - prices[j] - fee, dp[j])dp[i]=Math.max(dp[i... 阅读详情

相关推荐

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

494.目标和(JavaScript,动规)

494.目标和 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 示例 1: 输入:nums = [1,1,1,1,1], target = 3 输出:5 解释:一共有 5 种方法让最终目标

furfur-jiang的博客 245

用FPGA控制步进电机是种什么体验?从状态机到分频器,详解Verilog驱动A4988全流程

本文详细介绍了如何使用FPGA通过Verilog语言控制步进电机,从状态机设计到A4988驱动模块的精准控制全流程。FPGA的并行处理能力和纳秒级响应速度使其在步进电机控制中展现出显著优势,特别适合工业自动化和精密仪器应用。通过实战代码示例,展示了如何实现高效的状态机设计和可编程分频器,为开发者提供了一套完整的FPGA驱动步进电机解决方案。

weixin_30983965的博客 329

Leetcode 494:目标和(最详细的解法!!!)

给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例 1: 输入: nums: [1, 1, 1, 1, 1], S: 3 输出: 5 解释: -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1...

coordinate的博客 1万+

十一、增强现实

那都是n年前的老版本了,新版本完全没有这个问题,我就是纠结这个问题,搭建若干环境,又是vmware虚拟机,又是msys2,又是anaconda,又是找机器,折腾了几天,结果通通不是。以一张实际卡片为锚点,通过笔记本的摄像头,在显示器上将一个计算机内的3d物体显示在卡片上,类似于电影上看到的那种全息投影技术;如果你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。而如果你想开发的是windows运行程序,并且追求速度,那么二者相比而言,MinGW是更好的选择。

3188

AI在生物学领域的应用:基因序列分析和人工智能生物学

好的,非常感谢您提供的这个精彩的主题和详细的要求。我会全力以赴,遵循您的要求写一篇内容丰富、结构清晰、论述深入的专业技术文章。现在,就让我们开始这篇关于"AI在生物学领域的应用:基因序列分析和人工智能生物学"的博客文章吧! 1. 背景介绍 1.1 生物信息学的兴起

AI天才研究院 1414

LeetCode-目标和

这个题很容易能想到用DFS去做,只要将所有的累加情况列举出来,就能得到最终和为S的方案数 int count = 0; public int findTargetSumWays(int[] nums, int S) { find(0,nums,0,S); return count; } private void find(int index, int[] nums, int sum, int S){ if (index ...

yshuoo的博客 483

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 764

LeetCode灵神算法题库JS(111/200)第六天|213. 打家劫舍 II|64. 最小路径和|494. 目标和|322. 零钱兑换

这道题还是比较典型的,可以记一下DFS 实现慢很多的原因主要是因为它可能会探索大量的重复路径,并且每次递归调用都会增加额外的开销。相比之下,动态规划解决方案通过迭代一次网格来计算最小路径和,从而避免了这些开销。由于之前已经刷过一部分,目前从回溯-子集型开始更新由于之前已经刷过一部分,目前从。

Alicesflower的博客 2208

Chrome更新出现错误代码3: 0X80070422 -- system level的解决方案

本文主要介绍了Chrome更新出现错误代码3: 0X80070422 – system level的解决方案,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

prplOS介绍

介绍prplOS是什么,特性、框架、编译等。

四儿家的小祖宗的博客 2120

[leetcode]494. Target Sum -- JavaScript动态规划求解

先上代码:var findTargetSumWays = function(nums, S) { var sum = 0; nums.forEach(function(num){ sum += num; }); if(S>sum || S<-sum) return 0; var dp = []; dp[0+sum] = 1; v

YuqiRealm.com 939

7、基于机器学习的生产效率估计方法解析

本文探讨了基于机器学习的生产效率估计方法,重点介绍了效率分析树(EAT)和凸效率分析树(CEAT)算法的原理及其与传统自由处置壳(FDH)和数据包络分析(DEA)方法的对比。通过剪枝优化、生产可能性集构建及方向距离函数(DDF)估计,EAT和CEAT在避免过拟合、提升估计稳定性与处理凸性假设方面展现出优势。结合PISA教育数据的实证研究,采用箱线图、核密度图和非参数检验方法验证了不同模型效率得分分布的显著差异。研究表明,EAT与CEAT为生产效率评估提供了更准确、灵活的工具,适用于教育、企业生产和医疗等多个

milk5的博客 92

Leetcode - 每日一题(494. 目标和)

原题链接 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 示例 1: 输入:nums = [1,1,1,1,1], target = 3 输出:5 解释:一共有 5 种方法让最终目标和为

qq_45496907的博客 398

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

每日一题leetcode

每日一题leecode91.解码方法 leecode91.解码方法 题解: class Solution { public int numDecodings(String s) { int n = s.length(); int[] f = new int[n + 1]; f[0] = 1; for (int i = 1; i <= n; ++i) { if (s.charAt(i - 1) !=

qq_40506747的博客 1364

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JavaScript|LeetCode|动态规划|343.整数拆分

法1:动态规划 看了题解 想法: “给定一个正整数 n,将其拆分为至少两个正整数的和”。则 n >= 2 用数组dp保存整数 1 ~ n 经拆分后的最大乘积(后续需用到dp[1] = 1,比如 3 = 1 + 2) 拆分整数 i 时,先将其拆分为 i - j 和 j;最大值在下面几种情况中产生: (i - j) * j:即 i - j 和 j 均不再拆分 dp[i - j] * dp[...

J_learner的博客 634

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JavaScript|LeetCode|动态规划|322. 零钱兑换

法1:动态规划 看了题解 想法: 总金额amount是背包容量 coins是物品(coins.length是物品种类;coins[i]为每种物品的体积) 每种物品有无限个 目标:用最少数量的物品把背包填满 /** * @param {number[]} coins * @param {number} amount * @return {number} */ var coinChange...

J_learner的博客 503

JavaScript|LeetCode|动态规划|72. 编辑距离

法1:动态规划 想法: 先看看题目给的例子:word1 = “horse”, word2 = “ros” 初始化:每增加一行,表示指向 word1 的指针(i)向后移动一个字符;每增加一列,表示指向 word2 的指针(j)向后移动一个字符;当一个字符串为空时,另一个串只需要不断删除字符即可;假设填写数字的部分为 dp 数组,里面的数字为使得 word1 和 word2 当前字符串(即从第 0 位到各自指针指向的位置)相等的最小操作数 进行表格的填写,发现规律 对于dp[1][1],因为word1[

J_learner的博客 441

JavaScript|LeetCode|动态规划|1143. 最长公共子序列

法1:动态规划 看了题解 推荐去看 力扣 的该题题解 想法: 创建数组dp:dp[i][j]保存text1前i个、text2前j个字符中的两者的最长公共子序列;dp[0][j]和dp[i][0]均为0,因为此时表示text1或text2取空字符串时 /** * @param {string} text1 * @param {string} text2 * @return {number} ...

J_learner的博客 397

JavaScript|LeetCode|动态规划/BFS|279.完全平方数

法1:动态规划 想法: 数组dp保存当n = 1, 2, 3, ……时,将n分割成多个完全平方数的 完全平方数个数(最少个数) 如果 i 是完全平方数,则dp[i] = 1 如果 i 不是完全平方数,则dp[i] = min{dp[i], dp[i - j] + dp[j]}:将 i 分为两部分(j = 1 ~ i - 1),各部分可能也会被分割,但:动态规划无需考虑如何来,只需考虑结果如何(只...

J_learner的博客 379

JavaScript|LeetCode|动态规划|583. 两个字符串的删除操作

法1:动态规划 想法: 参见 JavaScript|LeetCode|动态规划|1143. 最长公共子序列 假设 word1 和 word2 的最长公共子序列长度为 L 最小步数 = word1.length - L + word2.length - L /** * @param {string} word1 * @param {string} word2 * @return {number} */ var minDistance = function(word1, word2) {

J_learner的博客 373

JavaScript|LeetCode|动态规划|62.不同路径

法1:动态规划 方法类同JavaScript|LeetCode|动态规划|64.最小路径和 法2 想法: 使用一个一维数组dp,来保存到达当前行的每个网格的不同路径数 到达第一行或第一列的每个网格的不同路径数目均为1 到达其他网格的不同路径数目:当前网格上面的一个网格、当前网格左面的一个网格,到达这两者的不同路径数之和 /** * @param {number} m * @param {n...

J_learner的博客 365

JavaScript|LeetCode|搜索|93.复原IP地址

法1:回溯 看了答案 想法: IP地址由4部分组成,四部分之间由 . 分隔,如:255.255.255.255(即11111111.11111111.11111111.11111111) 每部分>=0 && 每部分<= 255 每部分没有前导零 当前IP地址已经有4部分 && 输入的字符串已访问完最后一位,则当前IP地址是答案之一,存入 增加一个部分-...

J_learner的博客 361

JavaScript|LeetCode|双指针|167. 两数之和 II - 输入有序数组

法1 暴力破解 var twoSum = function(numbers, target) { var i,j; for(i = 0; i < numbers.length; i++) { for(j = 1; j < numbers.length; j++) { if(i == j) { con...

J_learner的博客 353

JavaScript|LeetCode|动态规划|416. 分割等和子集

法1:动态规划 想法: 将两个子集看作背包(容量均为数组元素和 / 2),数组中的数字作为物品(每个数字的值作为每个物品的体积) 问题:如何使得两个背包背的物品体积相等呢? 回答:只需要使得一个背包可以正好装满即可! 数组dp表示:容量为0~(数组元素和 / 2)的背包,可以容纳的物品的最大体积和 /** * @param {number[]} nums * @return {boolea...

J_learner的博客 339

JavaScript|LeetCode|动态规划|300.最长上升子序列

法1:动态规划 想法: 用数组dp保存:以nums[i]结尾的最长上升子序列长度 对于nums中每个数,dp[i]初始化为1,至少包含nums[i]本身 对于nums[i],要求dp[i],关键在于:找到dp[j],nums[j] < nums[i] (j < i),则dp[i] = dp[j] + dp[i]。注:需找到符合条件的dp[j]的最大值 最长上升子序列可能以 nums[...

J_learner的博客 335
上一篇: JavaScript|LeetCode|动态规划|416. 分割等和子集
下一篇: JavaScript|LeetCode|动态规划|474. 一和零
J_learner
博客等级 码龄8年 2粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值