问题描述:
假设你正在爬楼梯。需要 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 阶
提示:
1 <= n <= 45
一.题目分析
要爬n阶的楼梯,
1)如果n=1,那么不难判断出就只有一种方法:只能向上爬一个台阶;
2)如果n=2,那么我们也不难判断出,会有两种方法:第一种方法是一次性爬两个台阶;第二种方法是向上爬一个台阶,然后再向上爬一个台阶。
3)如果n>2,我们会发现,使用上面那种穷举法求方法数分析的情况就很多,也更复杂,但我们可以将复杂问题简单化。我们不难理解,要爬n(n>2)阶楼梯,必须经历的步骤是:爬到n-2阶楼梯后一次性向上爬两阶 或 爬到n-1阶台阶时再向上爬一个楼梯。这就意味着如果你知道爬n-2阶楼梯和n-1阶楼梯的方法数,将这两个方法数相加即为爬n个楼梯的方法数。那不妨我们设爬n阶楼梯的方法数为f(n),那么
f(n) = f(n-1) + f(n-2)
将求解f(n)的问题转换为求解f(n-1)与f(n-2),往下递归,这个复杂的问题即可求解。
二.代码展示(C++)
class Solution {
public:
int climbStairs(int n) {
int arr[45];
arr[0] = 1;//爬一个台阶的方法数
arr[1] = 2;//爬两个台阶的方法数
for(int i = 2;i < 45;i++)
{
arr[i] = arr[i-1]+arr[i-2];//依次算出arr[0]-arr[44]的解
}
return arr[n-1];
}
};