70. 爬楼梯

2022-08-01  本文已影响0人  水中的蓝天

70. 爬楼梯

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


示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

思路:第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去 递推公式: f(n) = f(n-1) + f(n-2)


class Solution {

    //方法一:记忆递归 O(n) O(n)
    public int climbStairs1(int n) {
        int[] memo = new int[n+1];
        return climbStairsMemo(n,memo);
    }

    private int climbStairsMemo(int n,int[] memo) {

        //1.爬到第n级的台阶已经计算过了,直接返回
        if(memo[n] > 0) {
            return memo[n];
        }

        //2.计算爬第N级台阶的方法有多少种
        if(n==1){ 
            return 1;
        } else  if(n==2) { 
            return 2;
        }else{
            memo[n] = climbStairsMemo(n-1,memo) + climbStairsMemo(n-2,memo);
        }

        return memo[n];

    }

    //方法二:斐波那契数列 O(n) O(1)
    public int climbStairs(int n) {

       if(n==1) return 1;
       int first = 1;
       int second = 2;
       for(int i = 3; i <= n;i++) {
           int tmp = first + second;
           first = second;
           second = tmp;
       }

       return second;

    }

}

进阶 : 每次你可以爬 1 或 4 个台阶呢。你有多少种不同的方法可以爬到楼顶呢?

进阶: 每次你可以爬 1 或 9 个台阶呢。你有多少种不同的方法可以爬到楼顶呢?

分析: 改变了第二种走法的台阶数递推公式还适用吗 ? 其实还是适用的 具体可以看下面的推导 不要被改变一个值迷惑

//1 1
//2 1
//3 1
//4 2
//5 11111 14 41 3
//6 111111 141 114 411  5
//7 (n-1)+(n-2) 8

上一篇 下一篇

猜你喜欢

热点阅读