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

185 篇文章 0 订阅
57 篇文章 1 订阅

先上代码:

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;
    var maxIndex = sum*2+1;
    nums.forEach(function(num){
        var tmp = [];
        for(var k=0;k<maxIndex;k++){
            if(dp[k] !== undefined && dp[k] !== 0){
                if(tmp[k+num] === undefined){
                    tmp[k+num] = dp[k];
                }else{
                    tmp[k+num] += dp[k];
                }

                if(tmp[k-num] === undefined){
                    tmp[k-num] = dp[k];
                }else{
                    tmp[k-num] += dp[k];
                }
            }
        }
        dp = tmp;
    });
    return dp[S+sum]===undefined?0:dp[S+sum];
};

这道题一开始我是用递归的方式求解,但是会超时,因此就改用了动态规划。

下面说一下对于这道题我的理解,动态规划我也不是很熟悉,仅作为参考吧,欢迎指正。

首先说一下这道题主要的思路。

第一,在我们对数组的访问过程中,动态规划数组dp,是不断变化的。

第二,动态数组dp的含义:当我们对数据访问到某个阶段m的时候,dp[n]的含义就表示,在阶段m这一刻时,到达n的可选方式有dp[n]种。
针对本道题来说,就是当我对数组访问到第m个的时候,那么这前m-1个数字所能组合成结果n的方式有dp[n]种。

第三,初始条件dp[0+sum] = 0的含义:当我们没有对数组进行任何访问的时候,我们可以获得总和0的选择有且只有一种,那就是数组中的数我们一个都不选。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值