斐波那契数列:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
每一项都等于前两项之和,0,1,1,2.。。。
1、暴力递归,牛客超时
class Solution:
def Fibonacci(self, n):
# write code here
if n == 0 :
return 0
if n == 1:
return 1
return self.Fibonacci(n-1) + self.Fibonacci(n-2)
2、反着推—牛客过 ——O(n)
(由于递归超时因为重复计算太多)
class Solution:
def Fibonacci(self, n):
# write code here
res = [0,1]
for i in range(2,n+1):
res.append(res[i-1]+res[i-2])
return res[n]
注意:for i in range(2,n+1):
3、剑指offer书上 O(logn)
好像都是公式不背了
延伸题目:
1、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
class Solution:
def jumpFloor(self, number):
# write code here
res = [1,2]
if number >= 3 :
for i in range(2,number):
res.append(res[i-1]+res[i-2])
return res[number-1]
在n级台阶处,有可能上一步是1台阶,或2 台阶,f(n) = f(n-1)+f(n-2) = 斐波那契数列
注意不从0开始,for i in range(2,number):
2、变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
=》 f(n) = 2*f(n-1)
| 1 ,(n=0 )
==》》 f(n) = | 1 ,(n=1 )
| 2*f(n-1),(n>=2)
class Solution:
def jumpFloorII(self, number):
# write code here
res = [1,2]
if number >=2 :
for i in range(2,number):
res.append(2*res[i-1])
return res[number-1]
矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
class Solution:
def rectCover(self, number):
# write code here
if number == 0:
return 0
res = [1,1]
for i in range(2,number+1):
res.append(res[i-1]+res[i-2])
return res[number]