70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
题解:
该题最先想到的肯定是递归 (ps: leetcode上这样写45这个用例会超时)
方法一
首先我们可以知道
- 爬一阶有1种方法
- 爬两阶有2种方法
爬三阶有以下两情况
先爬一阶 剩2个阶梯
先爬两阶 剩1个阶梯
所以f(3) = f(2) + f(1)
同理
爬n阶有以下两情况
先爬一阶 剩n-1个阶梯
先爬两阶 剩n-2个阶梯
所以f(n) = f(n-1) + f(n-2)
public static int climbStairs(int n) {
// 注意 这里是因为题目给定了n为正整数 真正规范的写法是用 == 判断
// 而且这里return n 是恰好返回的值与n相等 其他的递归应该写的更加严谨
if (n <= 2) {
return n;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
方法二
改成循环实现
public static int climbStairs(int n) {
// 注意 这里是因为题目给定了n为正整数 真正规范的写法是用 == 判断
// 而且这里return n 是恰好返回的值与n相等 其他的递归应该写的更加严谨
if (n <= 2) {
return n;
}
int n_1 = 1;
int n_2 = 2;
for (int i = 4; i <= n; i++) {
n_2 = n_1 + n_2;
n_1 = n_2 - n_1;
}
return n_1 + n_2;
}
方法三
听说还有fib通项公式啥的 反正我看不懂 数学渣渣