题目一描述:斐波那契数列_牛客网
输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
解法(1):空间O(1),时间O(n)
动态规划。
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n<=1:
return n
n_1, n_2 = 1, 0
i = 2
while i<=n:
n_1, n_2 = n_1 + n_2, n_1
i += 1
return n_1
解法(2):空间O(1),时间O(logn)
利用数学公式
再利用乘方的性质,递归得到最后的矩阵。
# -*- coding:utf-8 -*-
import numpy
class Solution:
def Fibonacci(self, n):
# write code here
if n<=1:
return n
a = numpy.array([[1,1],
[1,0]])
def pow_2(a, ep):
if ep==1:
return a
tmp = pow_2(a, ep >> 1)
if ep&1:
return numpy.matmul(numpy.matmul(tmp, tmp),a)
else:
return numpy.matmul(tmp, tmp)
return pow_2(a, n-1)[0][0]
题目二描述:跳台阶_牛客网
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解法(1):空间O(1),时间O(n)。
斐波那契数列的应用。
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if number<=2:
return number
n_2, n_1 = 1, 2
i = 3
while i<=number:
n_2, n_1 = n_1, n_1+n_2
i += 1
return n_1
扩展题目描述:变态跳台阶_牛客网
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解法(1):空间O(1),时间O(1)。
分析:最后一步可以跳1~n阶。f(n-1) + f(n-2) + ... + f(1) +1
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number<=0:
return 0
return 2**(number-1)
相关题目描述:矩形覆盖_牛客网
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:
解法(1):空间O(1),时间O(n)。
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number<=2:
return number
n_2, n_1 = 1, 2
i = 3
while i<=number:
n_2, n_1 = n_1, n_2+n_1
i += 1
return n_1