LeetCode70 爬楼梯

355 阅读1分钟

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 n 是一个正整数。

解法1: 如果这是一道初中数学题,我想我能很快解出来,现在到了力扣上是一点思路都没有。可能是越长大越笨了。。仔细观察其数学形式会发现是斐波那契数列。

斐波那契数列: f(0)=0,f(1)=1, f(n) = f(n-1)+f(n-2). 代码可直接写成斐波那契数列求和。

解法2: 动态规划

public int climbStairs(int n){
    int[] dp = new int[n+2];
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i < n; i++) {
        dp[i] = dp[i-1]+dp[i-2];
    }
    return dp[n];
}

代码写得比较符合斐波那契数列,所以dp[0]的值没有赋,新建dp数列的时候也把长度设置到了n+2会更加合理。 for循环的时候也要从第三层台阶开始。 这里其实dp[i],数组下标代表的是第几层阶梯,数组里的值代表上这层阶梯有几种方法。 比如说爬上第三层阶梯的方法等于爬上第二层阶梯的方法加上爬上第一层阶梯的方法,第四层阶梯时就等于第三层阶梯的方法加上第二层阶梯的方法。

总觉得动态规划的题对我来说不看题解是完全想不出来的,个人还是没有完全理解动态规划的思想。8月之前要搞明白动态规划这个点,也要多刷一些这方面的题。