Featured image of post 70. Climbing Stairs

70. Climbing Stairs

70. Climbing Stairs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 * @lc app=leetcode.cn id=70 lang=java
 *
 * [70] 爬楼梯
 *
 * https://leetcode.cn/problems/climbing-stairs/description/
 *
 * algorithms
 * Easy (54.41%)
 * Likes:    3474
 * Dislikes: 0
 * Total Accepted:    1.4M
 * Total Submissions: 2.6M
 * Testcase Example:  '2'
 *
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 * 
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 * 
 * 
 * 
 * 示例 1:
 * 
 * 
 * 输入:n = 2
 * 输出:2
 * 解释:有两种方法可以爬到楼顶。
 * 1. 1 阶 + 1 阶
 * 2. 2 阶
 * 
 * 示例 2:
 * 
 * 
 * 输入:n = 3
 * 输出:3
 * 解释:有三种方法可以爬到楼顶。
 * 1. 1 阶 + 1 阶 + 1 阶
 * 2. 1 阶 + 2 阶
 * 3. 2 阶 + 1 阶
 * 
 * 
 * 
 * 
 * 提示:
 * 
 * 
 * 1 <= n <= 45
 * 
 * 
 */
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// @lc code=start
class Solution {
    public int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        //注意下标index开始于i=3
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 2] + dp[i - 1];
            // System.out.println("dp[i]"+ "i:"+ i+":"+dp[i]);
        }
        return dp[n];
    }
}

// @lc code=end
1
2
3
4
5
6
 70. 爬楼梯(进阶版)
卡码网:57. 爬楼梯(opens new window)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
之前讲这道题目的时候因为还没有讲背包问题所以就只是讲了一下爬楼梯最直接的动规方法斐波那契)。

这次终于讲到了背包问题我选择带录友们再爬一次楼梯

这道题目 我们在动态规划爬楼梯 中已经讲过一次了这次我又给本题加点料力扣上没有原题所以可以在卡码网57. 爬楼梯 (opens new window)上来刷这道题目

我们之前做的 爬楼梯 是只能至多爬两个台阶

这次改为一步一个台阶两个台阶三个台阶.......直到 m个台阶问有多少种不同的方法可以爬到楼顶呢

这又有难度了这其实是一个完全背包问题

1阶2阶.... m阶就是物品楼顶就是背包

每一阶可以重复使用例如跳了1阶还可以继续跳1阶

问跳到楼顶有几种方法其实就是问装满背包有几种方法

此时大家应该发现这就是一个完全背包问题了

确定遍历顺序
这是背包里求排列问题12   21 步都是上三个台阶但是这两种方法不一样
所以需将target放在外循环将nums放在内循环

每一步可以走多次这是完全背包内循环需要从前向后遍历
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public int climbStairs(int n, int m) {
    //定義dp數組: dp[j]表示爬上j層樓梯,每一次最大可爬m階樓梯,總共有多少中方法爬到j層
    int[] dp = new int[n + 1];
    //初始化dp[]
    dp[0] = 1;
    //遍歷順序
       //求排列問題,所以先遍歷背包,後遍歷物品
    for (int j = 1; j <= n; j++) {
        for (int i = 1; i <= m; i++) {
            //每次選擇爬的層數i不能超過樓梯總層數j
            if (j >= i) {
                //遞推公式
                dp[j] += dp[j - j];
            }
        }
    }
    return dp[n];
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy