题目:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
example1:
input:n=2
ouput:2
解释:有两种方法可以爬到楼顶
1. 1 阶 + 1 阶
2. 2 阶
example2:
input:n=3
ouput:3
解释:有三种方法可以爬到楼顶
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
1 <= n <= 45
方法一:动态规划
f(x)表示爬到x阶台阶的方案数。爬最后一步到x阶时可能跨了一级或者两级。则到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和,即:
根据边界条件,从0到0只有一种方法 f(0) = 1,0到1:f(1) = 1
f(2) = 1 + 1 = 2,f(3) = 1 + 2 = 3,f(4) = 2 + 3 = 5,
通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n) 的实现,但是由于这里的 f(x) 只和 f(x−1) 与f(x−2) 有关,所以我们可以用滚动数组思想把空间复杂度优化成 O(1)
图片转载于力扣
int climbStairs(int n)
{
unsigned int a[3];
unsigned char i;
a[0] = 1;
a[1] = 1;
if (n <= 1)
return a[n];
else
{
for (i = 1; i <= n-1; i++)
{
a[2] = a[0] + a[1];
a[0] = a[1];
a[1] = a[2];
}
return a[2];
}
}