力扣第16刷-爬楼梯

简介: 力扣第16刷-爬楼梯

Example 18

爬楼梯

题目概述:假设你正在爬楼梯。需要 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 阶

解题思路:用f(x) 表示爬到第x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以可以列出如下式子:

f(x)=f(x−1)+f(x−2)

它意味着爬到第x 级台阶的方案数是爬到第x−1 级台阶的方案数和爬到第x−2 级台阶的方案数的和。很好理解,因为每次只能爬1 级或2 级,所以f(x) 只能从f(x−1) 和f(x−2) 转移过来,而这里要统计方案总数,就需要对这两项的贡献求和。

解题步骤:

1. 若n为1,返回1,若n为2,返回2。

2. 定义变量p、q、r分别代表f(x - 2)、f(x - 1)、f(x)的函数值。

3. 定义for循环,从3至n开始考察,令p = q、q = r、r = p + q,即令本轮的f(x - 2)等于上轮的f(x - 1),本轮的f(x - 1)等于上轮的f(x),本轮的f(x)等于本轮的f(x - 1)与本轮的f(x - 2)之和。

4. n是从3开始,因此在第2步定义变量赋初值时,第三轮的p为第2轮的q即第一轮的r,即f(1),第三轮的q为第2轮的r,即f(2),因此将q赋初值为1,r赋初值为2。

5. 循环结束后将r返回,即为爬n节台阶的方式数目。

 

示例代码如下:

public class ClimbStairs {
    /**
     * 假设你正在爬楼梯。需要 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 阶
     * 来源:力扣(LeetCode)
     * 链接:https://leetcode.cn/problems/climbing-stairs
     */
    public static void main(String[] args) {
        ClimbStairs cs = new ClimbStairs();
        System.out.println(cs.climbStairs(3)); // 3
    }
    /**
     * 个人参考官方
     *
     * @param n
     * @return
     */
    public int climbStairs(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        int p = 0, q = 1, r = 2;
        for (int i = 3; i <= n; ++i) {
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }
    /**
     * 官方
     * @param n
     * @return
     */
/*    public int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }*/
}
相关文章
|
1月前
LeetCode爬楼梯
解决LeetCode上“爬楼梯”问题的动态规划方法,其中每次可以爬1或2个台阶,目标是计算到达楼顶的不同方法数。
30 0
|
3月前
|
算法 Java
LeetCode第70题爬楼梯
这篇文章是关于LeetCode第70题"爬楼梯"的解题分享。作者首先分析了题目,指出这是一个简单的问题,并且可以通过观察发现爬楼梯的规律:到达第n层楼梯的走法数等于到达第n-1层和第n-2层楼梯的走法数之和。接着,作者提供了一个Java语言的代码实现,使用了迭代的方式来计算爬楼梯的走法数。最后,作者总结了动态规划思想在解决这类问题时的应用,强调了通过观察问题找出规律的重要性。
LeetCode第70题爬楼梯
|
6月前
【力扣】70. 爬楼梯
【力扣】70. 爬楼梯
|
6月前
leetcode-70:爬楼梯
leetcode-70:爬楼梯
48 0
爬楼梯(LeetCode-70)
爬楼梯(LeetCode-70)
95 0