力扣70 爬楼梯:
提示:一维dp+空间优化
问题描述
假设你正在爬楼梯。需要n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
题解分析:
提示:空间优化结合斐波那契数列
使用一维dp
数组,数组大小为给定的n+1
,下标i代表爬到第几层楼梯,dp[i]
代表爬到第i层的解决方案个数
- 设置
dp
数组边界初始状态,dp[0]=1
,dp[1]=1
- 分析状态转移方程,
dp[i]=dp[i-1]+dp[i-2]
,含义为到达第i
个阶梯,可以先到达第i-2
层阶梯跨两部到达,同理i-1
层阶梯跨一步到达 - 最终遍历数组更新每一步的状态,最终返回
dp[n]
解决方案:
提示:空间优化
class Solution {
public int climbStairs(int n) {
if(n==0||n==1){
return n;
}
int[] dp=new int[n+1];
dp[0]=1;dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
}
class Solution {
public:
int climbStairs(int n) {
if(n==1){
return 1;
}if(n==2){
return 2;
}
int n1=1,n2=2,n3=0;
for(int i=3;i<=n;i++){
n3=n1+n2;
n1=n2;
n2=n3;
}
return n3;
}
};