时间复杂度: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
}
感悟
非常非常简单的一道动态规划题目,需要注意的是要学会滚动数组的思想来优化代码!