力扣(leetcode) 70. 爬楼梯 (动态规划)

题目在这: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 res

你可能感兴趣的:(交流学习,个人笔记,leetcode,python)