您的位置:首页 > 编程语言 > Python开发

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

2020-07-16 18:01 169 查看

一只青蛙一次可以跳上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]
算得的,用空间换取时间。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: