思路:
这种题应该用动态规划,因为上到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; } };