假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路:
1、题目分析
有多少方法可以爬到楼顶,那第n层有多少方法一定和第n-1层有关系。所以不用多说动态规划。
2、解题分析
- 如果楼层小于等于2直接返回;1层返回1,2层返回2(跨一步+两小步)
- 如果大于3层就可采用动态规划的方法解决了,我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶(往后退一步跨两步),所以我们可以列出如下式子:f(x)=f(x−1)+f(x−2)
- 当前的状态和上个状态和上上个状态都有关系,状态转移方程列出来了题目就已经解决了
- 当然动态规划需要一个数组就存储这个状态dp[0]~dp[n-1].
- 不优化:直接用数组存储时间复杂度O(n)
- 优化:利用滚动数组思想,只和x-1和x-2状态有关;所以利用这样等价转换:a,b=b,a+b。完成空间复杂度的降低
代码如下:
class Solution:
def climbStairs(self, n: int) -> int:
#动态规划
dp=[0 for i in range(n)]
if n==2:
return 2
if n==1:
return 1
dp[0]=1
dp[1]=2
for i in range(2,n):
dp[i] = dp[i-1]+dp[i-2]
return dp[-1]
#降低空间复杂度,结果只和前两个状态有关
a,b=1,2
for i in range(2,n):
a,b = b,a+b
return b