70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
爬楼梯问题本质还是斐波那契数列。
1.递归求解
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n;
if (n == 2) return 2;
return climbStairs(n - 1) + climbStairs(n - 2);
}
};
用递归方法求解,是最简单也是最容易想到的,但时间复杂度过大,很多编译器都不会通过的
![]()
(图画的很丑,不过大概的意思理解就可)
2.迭代法求解
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n;
int dp1 = 1, dp2 = 2, sum = 0;
for (int i = 3; i <= n; i++) {
sum = dp1 + dp2;
dp1 = dp2;
dp2 = sum;
}
return dp2;
}
};
这里我并没有像斐波那契数列一样从1、1、2这样开始,而是选择直接从1、2开始,是为了方便理解楼梯,也更符合实际。
本文也只是记录自己开始写算法的历程,不是专门讲解算法,有什么问题还请大家指点。