题目在这​​:https://leetcode-cn.com/problems/climbing-stairs/​

思路分析:

这是一道典型的动态规划基础题。

简单分析一下找到递推公式。

当有1节台阶,只有1种方法。
当有2节台阶,有2种方法。 两次1节和一次2节。
当有3节台阶的时候,我们可以从第1节迈到第三节,也可以从第2节迈到第3节,所以是1+2=3种方法。
同样 4节台阶的还是,是3节台阶和2节台阶的组合数相加 2+3=5种

划重点!!!

这里需要注意一个误区:我们要找的是迈到第三节的方法组合数,而不是迈的阶数。
也就是说,我们从平底(0节)迈了1步迈到1节,从1节迈了2步迈到3节,这里是一种方法。
所以这里是两种方法的相加:1+2=3。 不要理解成,从1节迈到3节 还要加1,这样是不对的。

所以递推公式,n = n-1 + n-2

完整代码:

class Solution:
def climbStairs(self, n: int) -> int:

dp = [0] * (n+1)
if n == 1:
return 1
if n == 2:
return 2
dp[1] = 1
dp[2] = 2

for i in range(3,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]

整个过程中仅用到了 前一层和前两层的数据。
所以进一步压缩状态:

完整代码:

class Solution:
def climbStairs(self, n: int) -> int:

if n == 1:
return 1
if n == 2:
return 2
a = 1
b = 2
for i in range(3,n+1):
res = a + b
a = b
b = res
return