5、斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
解答:第一个自己的,第二个动态规划,第三个
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n == 0:
return 0
if n == 1:
return 1
res = n - 1
if n == 2:
return 1
i = 3
res1 = 1
res2 = 1
while i <= n:
res3 = res2 + res1
t = res2
res1 = t
res2 = res3
i += 1
return res3
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
res=[0,1,1,2]
while len(res)<=n:
res.append(res[-1]+res[-2])
return res[n]
6、跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
笔记:推算到5没注意找到斐波那契数列的规律(捂脸),一直把注意力放在除以2的商,几个2和1的全排列上,然而写不出来,很乱的思路,看了评论和回答,竟是如此,刚刚做过的题,注意到这种题要找规律呀,这类是笔试常考的,得熟练
思路:
对于本题,前提只有 一次 1阶或者2阶的跳法。
a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
a = 1
b = 1
for i in range(number):
a,b = b,a+b
return a
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, n):
# write code here
res=[1,1,2]
while len(res)<=n:
res.append(res[-1]+res[-2])
return res[n]
7、矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
笔记:刚开始找的规律不正确,注意2n不能也当做n*2,其中2指的是高~这样就找到规律了
评论区的解析
链接:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
来源:牛客网
相应的结论应该是:
(1)1 * 3方块 覆 盖3n区域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 4 方块 覆 盖4n区域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的结论,如果用1m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number == 0:
return 0
a = 1
b = 1
for i in range(number):
a,b = b,a+b
return a