一.问题描述
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2 Output: 2 Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: 3 Output: 3 Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step
二.解题思路
这道题得用动态规划来解决,它没有后效行,即i之后的解或者值并不会影响i之前的最优解。
然后动态规划只要就是要确定一下,已经0~i的子问题的最优解,如何确定i+1的解。
对于这道题的i+1来说,我们可以思考一下i+1是怎么来的,它可以从i-1跳两个过来,也可以从i跳一格上来。
因为跳上i+1的所有方法是跳上i-1的方法数加上跳上i的方法,很明显跳上i-1和跳上i不可能有重叠解(他们的跳上的级数都不一样)。
综述 : res[i]=res[i-1]+res[i-2], 初始条件 res[1]=1 res[2]=2.
时间复杂度:O(N),空间复杂度:O(N).
更多leetcode算法题解法: 专栏 leetcode算法从零到结束
三.源码
class Solution:
def climbStairs(self, n: int) -> int:
res=[1]*n
for i in range(1,n):
res[i]=res[i-1]+res[i-2]
return res[n-1]