2024.07.10——leetcode动态规划

53 阅读1分钟

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];
};