代码随想录算法训练营第44天 | 977.有序数组的平方 、27. 移除元素
- 零钱兑换
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
这句话结合本题 大家要好好理解。
视频讲解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.零钱兑换.html
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
const dp = new Array(amount+1).fill(Infinity);
dp[0] = 0;
for (let i=0;i<coins.length;i++) {
for (let j=coins[i];j<=amount;j++) {
dp[j] = Math.min(dp[j], dp[j-coins[i]]+1);
}
}
return dp[amount]===Infinity? -1:dp[amount];
};
279.完全平方数
本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做
视频讲解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.完全平方数.html
/**
* @param {number} n
* @return {number}
*/
var numSquares = function(n) {
const dp = new Array(n+1).fill(Infinity);
dp[0] = 0;
for (let i=0;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];
};
139.单词拆分
视频讲解:https://www.bilibili.com/video/BV1pd4y147Rh
https://programmercarl.com/0139.单词拆分.html
这题先复制题解,没时间了
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
let dp = 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) {
if(s.slice(i - wordDict[j].length, i) === wordDict[j] && dp[i - wordDict[j].length]) {
dp[i] = true
}
}
}
}
return dp[s.length];
};
关于多重背包,你该了解这些!
https://programmercarl.com/背包问题理论基础多重背包.html