标签:不同 int 空间 思路 不用 code vector for 移动
仅供自己学习
思路:
这种题应该用动态规划,因为上到n台阶的方案需要分成不同种方案,即上一层和上两层的多种组合。
首先考虑上到最后一层,可以有上一层台阶到达最后一层,也可以有上两层台阶到达最后一层,那么总的方法就有 dp[n]=dp[n-1]+dp[n-2]种。
因为题目给的范围不为0,所以dp[0]不需要初始化,1层只有1种方法,2层有两种就初始为dp[1]=1,dp[2]=2.
这样遍历n,建立长度为n得数组,那么时间空间消耗都为O(n)
代码:
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n+2);
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;++i){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
因为我们根据公式dp[n]=dp[n-1]+dp[n-2]得到dp[n]后,求dp[n+1]时,dp[n-2]就可以不用了,那么我们只需用三个变量即可,每次获得最新的数值就把原来的向前移动即可。,那么时间复杂度不变,空间复杂度为O(1)
class Solution {
public:
int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
if(n==3) return 3;
int dp1=1;
int dp2=2;
int dp3=3;
for(int i=4;i<=n;++i){
dp1=dp2;
dp2=dp3;
dp3=dp1+dp2;
}
return dp3;
}
};
因为n只从1开始,那么还可这样简洁的写
class Solution {
public:
int climbStairs(int n) {
int dp1=0;
int dp2=0;
int dp3=1;
for(int i=1;i<=n;++i){
dp1=dp2;
dp2=dp3;
dp3=dp1+dp2;
}
return dp3;
}
};
标签:不同 int 空间 思路 不用 code vector for 移动
原文地址:https://www.cnblogs.com/Mrsdwang/p/14615417.html