70. 爬楼梯

104 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

一、题目描述:

70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

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

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

 

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 45

二、思路分析:

这个题目如果以前没做过,第一次做的话确实可能看着有一点儿迷茫,不过这个题目确实是典型的动态规划类问题,可以很轻易的写出状态转移方程: f(n) = f(n-1)+f(n-2) 一看就很熟悉-斐波那契数列,那就很好解决了,(自顶向下的递归)。首先还是从最基础的方法一步一步的来优化和拓展方法,最简单的肯定是直接递归,但是应该是超时了,那就可以考虑一下优化递归方式,或者说直接不使用递归,往往也能达到较好的时间和空间复杂度

三、AC 代码:

class Solution {
public:
    int res = 0;
    int climbStairs(int n) {
        if(n <= 1)
            return 1;
        res = climbStairs(n-1) + climbStairs(n-2);
        return res;
    }
};
class Solution {
public:
    int climbStairs(int n,int t1=0,int t2=1) {

        if(n<=1)
            return t2;
        //这里采用的是尾递归的方式,可以大大节约时间和空间的消耗。
        return climbStairs(n-1,t2,t1+t2);              
    }    
};

非递归

class Solution {
public:
    int climbStairs(int n) {

        int stairs[n];
        stairs[0] = 1;        
        if(n>=2){
            stairs[1] = 2;
            for(int i=2;i<n;i++)
                stairs[i] = stairs[i-1] + stairs[i-2];
        }
    return stairs[n-1];        
    }    
};

范文参考:

【知信】花式爬楼梯,从暴力爬楼梯,到动态规划爬楼梯 - 爬楼梯 - 力扣(LeetCode)

「代码随想录」动态规划精讲!结合70. 爬楼梯 - 爬楼梯 - 力扣(LeetCode)