LeetCode 70. 爬楼梯
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意: 给定 n 是一个正整数。
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
Java 实现代码
方法:迭代
class Solution {
public int climbStairs(int n) {
if (n <= 2) {
return n;
}
int first = 1, second = 2;
for (int i = 3; i <= n; i++) {
int third = first + second;
first = second;
second = third;
}
return second;
}
}
解题思路
这个问题是斐波那契数列的一个变种。我们可以观察到,要到达第 n 个台阶,有两种情况:
- 从第 n-1 个台阶走上来,方法数为
climbStairs(n-1)
。- 从第 n-2 个台阶走上来,方法数为
climbStairs(n-2)
。因此,到达第 n 个台阶的总方法数为
climbStairs(n-1) + climbStairs(n-2)
。这就是斐波那契数列的定义。
复杂度分析
- 时间复杂度:O(n),因为我们需要从 1 到 n 遍历一次。
- 空间复杂度:O(1),我们只需要常数级别的空间来存储几个变量。
通过使用动态规划的思想,我们可以避免重复计算,从而提高效率。上面的代码实现了这一思想,通过迭代而不是递归来计算爬楼梯的方法数。
注:题目来源leetcode网站