LeetCode之剑指offer-斐波那契数列(跳台阶问题)

题目描述:

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

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

输入:n=2    输出:1        输入:n=5    输出:5

 

斐波那契数列是一个经典的一维动态规划问题,动态规划的精髓就是通过记住一些事情来节省时间。

关于动态规划问题现在还不能完全总结清楚,可能要等到后面再来补充了。

class Solution:  # 一维动态规划
    def fib(self, n):
        num = {}
        num[0] = 0
        num[1] = 1
        if n > 1:
            for i in range(2, n+1):
                num[i] = num[i-1] + num[i-2]
        return int(num[n]%(1000000007))

horizon = Solution()
print(horizon.fib(5))

分析:

使用一个长度为 n+1 的数组 dpdp[i] 为 F(N) 的值。然后初始化 dp[0]dp[1],计算每个位置上的值,最后返回第 n 项。

还有一个跳台阶问题和斐波那契数列类似,都是一维动态规划问题。

题目描述:

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

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

输入:n=2    输出:2        输入:n=7    输出:21

class Solution:
    def numWays(self, n: int) -> int:
        num = {}
        num[0] = 1
        num[1] = 1
        if n > 1:
            for i in range(2,n+1):
                num[i] = num[i-1] + num[i-2]
                
        return num[n]%1000000007

分析:

从第三级台阶开始,每一级能到的途径有两种:

从前一个台阶跳一步上来

从前两个台阶跳两步上来

那么到第n级台阶的方法数量就是前一步的结果加上前前一步的结果(是不是跟斐波那契数列一毛一样)。

或者说到某一级台阶的方法数量就是到前两级台阶方法数的和,忽略到前两级台阶的过程,当成两个点来记录方法数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值