学习算法4 动态规划

93 阅读1分钟

1、leetcode 120

var minimumTotal = function(triangle) {
    // 获取三角形的长度
    let length = triangle.length-1;
    // 1、赋值temp为三角形最后一行
    let temp = triangle[triangle.length-1];
    // 3、循环 从三角形的倒数第二行(triangle.length-1)
    //  到 三角形的第一行 (0)
    for (let i = length-1; i >=0; i--) {
        // 4、每一行从左至右循环 长度为triangle[i].length-1
        for (let j = 0; j < triangle[i].length; j++) {
            // 5、当前temp中的每一项为:triangle的当前行的每一项
            // 与  下一行 优化后(是temp,不是triangle)的和
            temp[j]=triangle[i][j]+Math.min(temp[j],temp[j+1])            
        }        
    }
    // 2、需要的结果为 计算后的temp[0]的值
    return temp[0];
};

2、leetcode 332

// 建立一个amount+1长度的数组 arr[i]存放amount==i时的最优解的值
// 从0开始计算数组 arr[amount]就是结果
var coinChange = function(coins, amount) {
    // 边界值
    if(amount==0){
        return 0
    }
    // 利用最大值和当前值求一个最小值
    let arr = Array(amount+1).fill(Number.MAX_VALUE);
    // 数组边界值 计算arr后一项的基础
    arr[0]=0;
    // 外层 循环数组 知道计算出第amount项
    for (let i = 0; i < arr.length; i++) {
        // 内层 循环coins 
        for (let j = 0; j < coins.length; j++) {
            // 当可以兑换零钱时 找到规律 得到arr[i]的值
            if(i-coins[j]>=0){
				//
                arr[i]=Math.min(arr[i],arr[i-coins[j]]+1)
            }       
        }
    }
    // 当第amount项没有被计算过 返回-1 否则arr[amount]
    return arr[amount]==Number.MAX_VALUE?-1:arr[amount];
};