剑指 Offer 10- II. 青蛙跳台阶问题 Python

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

提示:

0 <= n <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

还是按照上一题的写法,可以这样写,但是我觉得这样没有第二种写法直白好理解。见仁见智吧。

class Solution:
    def numWays(self, n):
        a, b = 1, 1
        if n>=1 :
            for _ in range(n-1):
                a, b = a+b , a
        return a % 1000000007
class Solution:
    def numWays(self, n: int) -> int:
    	# 动态规划法 
        dp = [0] * (n+1)
        dp[0] = 1
        if n >= 1:
            dp[1] = 1
            for i in range(2, n+1):
                dp[i] = dp[i-1] + dp[i-2]
        return dp[n] % 1000000007
  • 初始化dp = [0] * (n+1)其中dp[i]为斐波那契数列的第i项的值
  • f(n) = f(n-1) + f(n-2)其中f(0)f(1)1, 等式成立当 n>=2

动态规划法

使用动态规划进行求解的时候,这个问题本身除了具备最优子结构特性以外,还具备求解过程中,子问题划分的过程中存在大量重复的计算的特征。

  • 具备最优子结构 f(n) = f(n-1) + f(n-2)
  • 存在大量重复计算 例如:f(5) = f(4) + f(3) = (f(3)+f(2)) + (f(2)+f(1))
  • 可递归,亦可迭代

就这题而言,用了备忘录算法,避免了重复计算,dp[i]是通过已记录的dp[i-1]dp[i-2]算得的,用空间换取时间。

你可能感兴趣的:(python,leetcode)