279. 完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9
- 这个题目,第一个难点怎么确认背包数量
- 你如何去初始化数组,实际上,每个相里面,最坏情况实际上是由当前容量数个1来决定。
- 其次,里面当选择了i物品,为何不是i-1,这个其实是优化后的,因为正常其实还是需要对之前的状态,一直进行一个累加,直接为dp[i][j-nums[i]] 是优化后的
/**
* @param {number} n
* @return {number}
*/
var numSquares = function (n) {
let m = Math.floor(Math.sqrt(n))
let dp = new Array(m + 1).fill(Infinity).map(() => new Array(n + 1).fill(Infinity));
for (let i = 0; i < dp.length; i++) {
for (let j = 0; j < dp[i].length; j++) {
dp[i][j] = j;
}
}
for (let i = 1; i <= m; i++) {
for (let j = 0; j <= n; j++) {
if (j >= i * i) {
for (let k = 1; k * i * i <= n; k++) {
if (j >= k * i * i) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - k * i * i] + k)
}
}
} else {
dp[i][j] = dp[i - 1][j]
}
}
}
return dp[m][n]
};
322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
let dp = new Array(coins.length+1).fill(Infinity).map(()=>new Array(amount+1).fill(Infinity));
for(let i = 0;i<=coins.length;i++){
dp[i][0] = 0
}
for(let i = 1;i<=coins.length;i++){
for(let j = 0;j<=amount;j++){
if(j >=coins[i-1]){
// 这里注意是i 而不是 i -1 同时加1代表了 第i个硬币加入的个数
dp[i][j] = Math.min(dp[i-1][j],dp[i][j-coins[i-1]]+1)
}else {
dp[i][j] = dp[i-1][j]
}
}
}
return dp[coins.length][amount] === Infinity ? -1 : dp[coins.length][amount]
};