代码随想录算法训练营第三十八天| 322. 零钱兑换 、 279.完全平方数 、139.单词拆分

36 阅读1分钟

322. 零钱兑换

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var coinChange = function(coins, amount) {
    var dp =  Array(amount + 1).fill(Infinity);
    dp[0] = 0;
    for(let j=0;j<=amount;j++){
        for(let i=0;i<coins.length;i++){
            if(j>=coins[i]  && dp[j - coins[i]] !== Infinity){
                dp[j] = Math.min(dp[j-coins[i]] +1, dp[j]);
            }
        }
    }
     return dp[amount] === Infinity ? -1 : dp[amount]
};

279.完全平方数

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var numSquares = function(n) {
    var  dp = new Array(n+1).fill(Infinity);
    dp[0] = 0
    for(let i=1;i*i<=n;i++){
        for(let j=i*i;j<=n;j++){
            dp[j] = Math.min(dp[j-i*i]+1,dp[j]);
        }
    }
    return dp[n] === Infinity?0:dp[n];
};

139.单词拆分

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var wordBreak = function(s, wordDict) {
    let dp = new Array(s.length+1).fill(false);
    dp[0] = true;
    for(let i=0;i<=s.length;i++){ //背包
        for(let j=0;j<wordDict.length;j++){  //物品
            if(i>=wordDict[j].length){
                //包含i-wordDict[j].length, 不包含 i
                  if(s.slice(i-wordDict[j].length,i) === wordDict[j] && dp[i - wordDict[j].length]){
                    dp[i] = true;
                  }
            }
        }
    }
    return dp[s.length]
};

多重背包知识点

相关链接:文章讲解  背包总结