力扣算法JS LC [746. 使用最小花费爬楼梯] LC [62. 不同路径]

动规算法采用了 代码随想录 的动规五部曲的步骤来做 代码随想录

LC 746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
​
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
  总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
​
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
  总花费为 6 。

解题思路:使用动规五部曲。到达当前楼梯 i 有两种方法,一种由 i - 1来,一种由 i - 2来。

代码:

var minCostClimbingStairs = function(cost) {
    let dp = [cost[0], cost[1]];
    for(let i = 2; i < cost.length; i++) {
        dp[i] = Math.min(dp[i - 1] + cost[i], dp[i - 2] + cost[i]); //将当前值与上一个值和当前值与上二个值进行对比,选取最小的。
    }
    return Math.min(dp[cost.length  -1], dp[cost.length - 2]) //返回倒一和倒二中最小的值
};

LC 62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
​
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

解题思路:动规五部曲。递归公式:每一个 (i,j)位置都是从(i-1,j)或者(i,j-1)而来的

代码:

var uniquePaths = function(m, n) {
    let dp = Array(m).fill().map(item => Array(n)); //创建二维数组
    for(let i = 0; i < m; i++) {
        dp[i][0] = 1; //将每行第一个的路径值都设为 1
    }
    for(let i = 0; i < n; i++) {
        dp[0][i] = 1; //将每列第一个的路径值都设为 1
    }
    for (let i = 1; i < m; ++i) {
        for (let j = 1; j < n; ++j) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1] //每个dp[i][j] 都从 dp[i-1][j] 或 dp[i][j - 1]来的
        }
    }
    return dp[m - 1][n - 1]
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值