斐波那契数列
写一个函数,输入 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。
示例 1:
输入:n = 2
输出:1
示例 2:输入:n = 5
输出:5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
数字较大时,使用递归方法会超时,这里采用动态规划算法解决。创建大小为n+1的数组dp,很容易得出边界条件为dp[0]=0,dp[1]=1,递推方程为dp[i]=dp[i-1]+dp[i-2]。
class Solution(object):
def fib(self, n):
"""
:type n: int
:rtype: int
"""
if n==0 or n==1:
return n
dp=[0]*(n+1)
dp[0]=0
dp[1]=1
for i in range(2,n+1):
dp[i]=(dp[i-1]+dp[i-2])%1000000007
return dp[n]
考虑到使用数组会有较大的空间开销,采取以下方式优化,使用dp_a,dp_b,dp_c三个变量代替数组。
class Solution(object):
def fib(self, n):
"""
:type n: int
:rtype: int
"""
if n==0 or n==1:
return n
dp_a=0
dp_b=1
for i in range(2,n+1):
dp_c=(dp_a+dp_b)%1000000007
dp_a,dp_b=dp_b,dp_c
return dp_c
青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
如果没有台阶,青蛙有0种跳法,如果有1级台阶,青蛙有1种跳法,如果有2级台阶,青蛙可选择跳1级,可选择跳2级,有两种跳法。
对于n级台阶的问题,假设青蛙要一步跳到第n级台阶,那么当前青蛙要么在第n-1级台阶跳一级,要么在第n-2级台阶跳两级;那么青蛙如何跳到第n-1级台阶,要么在第n-2级台阶跳一级,要么在第n-3级台阶跳两级…
边界条件为:f(0)=0,f(1)=1
递推方程为:f(n)=f(n-1)+f(n-2)
可用递归实现,也可模仿以上过程使用动态规划实现,代码与上一个问题代码相同。
第N个泰波那契数
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-th-tribonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution(object):
def tribonacci(self, n):
"""
:type n: int
:rtype: int
"""
if n==0:
return 0
if n==1 or n==2:
return 1
dp_a=0
dp_b=1
dp_c=1
for i in range(3,n+1):
dp_d=dp_a+dp_b+dp_c
dp_a,dp_b,dp_c=dp_b,dp_c,dp_d
return dp_d