携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 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];
}
};