322.零钱兑换
dp[j]是凑足总金额为j的钱币个数
var coinChange = function(coins, amount) {
if(!amount){
return 0;
}
let dp = 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 - coins[i]] + 1, dp[j]);
}
}
if(dp[amount] === Infinity){
return -1;
}
return dp[amount];
};
279.完全平方数
dp[j]为和为j的完全平方数的最小数量
dp[j - val]为当前 和j 减去当前 完全平方数i * i 需要的最小数量,+1表示使用当前 完全平方数i * i后需要的最小数量
dp[j] = Math.min(dp[j], dp[j - val] + 1);括号里的dp[j]是上一次遍历所需最小值,
var numSquares = function(n) {
let dp = new Array(n + 1).fill(Infinity);
dp[0] = 0;
for(let i = 1; i**2 <= n; i++){
let val = i**2;
for(let j = val; j <= n; j++){
dp[j] = Math.min(dp[j], dp[j - val] + 1);
}
}
return dp[n];
};
119.杨辉三角Ⅱ
var getRow = function(rowIndex) {
// 当索引rowIndex = 3时,应该返回第四行(有4个数)的数组,因为索引下标从0开始,
let c = new Array(rowIndex + 1).fill(0);
for(let i = 0; i <= rowIndex; i++){
// i从0开始,举例:杨辉三角第一行有1个数,所以new的数组为i + 1个值
c[i] = new Array(i + 1).fill(0);
// 杨辉三角的每一行的开始和末尾都为1
c[i][0] = c[i][i] = 1;
// 注意:这里j从1开始,因为杨辉三角的每一行的开始和末尾已设置
for(let j = 1; j < i; j++){
// 杨辉三角的规律,详记
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
}
}
return c[rowIndex];
};