这里写目录标题
问题描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
分析
第一种思路:动态规划
状态定义:dp[n]爬到第n阶楼梯的方法
状态转移方程:dp[n]=dp[n-1]+dp[n-2];
base case:dp[1]=1,dp[2]=2;
代码:
Class solution{
public int climbStairs(int n) {
if (n <= 1)
return 1;
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
复杂度:
时间复杂度:o(n)
空间复杂度:o(n)
空间优化:
Class Solution{
public int climbStairs(int n) {
if (n <= 2)
return n;
int preOfpre=1,pre=2,cur=0;
for(int i=3;i<=n;i++){
cur=pre+preOfpre;
preOfpre=pre;
pre=cur;
}
return cur;
}
}
空间复杂度:o(1)
第二种思路:数学
如果观察数学规律,可知本题是斐波那契数列,那么用斐波那契数列的公式即可解决问题,公式如下:
class Solution {
public int climbStairs(int n) {
double sqrt_5 = Math.sqrt(5);
double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
return (int)(fib_n / sqrt_5);
}
}