
时间复杂度:O(n),空间复杂度:O(1)
解题思路
推荐动态规划!
用dp数组记录走n个台阶的方法数。由于每次可以走一个台阶也可以走两个台阶,所以当走第n个台阶时,依赖于走前一个台阶的方法数(然后走一步)和前两个台阶的方法数(然后走两步),第n个台阶的方法数就是二者之和。所以转移方程为:
dp[i]=dp[i-2]+dp[i-1]
对于第一级台阶,我们只能走一步,所以dp[1]=1。以及由于不走台阶时也只有一种走法,所以dp[0]=1。
综上状态转移方程为:
有没有发现其实dp[i]仅依赖于前两个dp的状态?所以利用滚动数组的思想,我们可以仅用三个变量记录dp状态,这样空间复杂度可从O(n)降为O(1)。
AC代码
func climbStairs(n int) int {
climb2,climb1,res:=0,0,1
for i:=0;i<n;i++{
climb2=climb1
climb1=res
res=climb2+climb1
}
return res
}
感悟
非常非常简单的一道动态规划题目,需要注意的是要学会滚动数组的思想来优化代码!

博客介绍了用动态规划解决台阶问题的思路。通过dp数组记录走n个台阶的方法数,状态转移方程为dp[i]=dp[i - 2]+dp[i - 1]。还提到利用滚动数组思想,仅用三个变量记录dp状态,可将空间复杂度从O(n)降为O(1),最后强调要学会此优化方法。

被折叠的 条评论
为什么被折叠?



