题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
要求时间限制1秒
思路1–满足时间复杂度 先把n = 0,1,2,这三个项确定了再使用递归
斐波那契数列数列从第3项开始,每一项都等于前两项之和。
例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这种方法的原理仍然基于上面的公式,但是用循环代替了递归,比上面的代码效率上有较大的提升,可以
class Solution:
def Fibonacci(self, n):
if n == 0:
return 0
if n == 1:
return 1
if n == 2:
return 1
if n > 39:
return False
if n >= 3:
a = 1
b = 1
for i in range(n-1):
a,b = b,a+b #这个是重点 复杂赋值 这个都没有用到i 是如何确定他会一直走下去的??
return a
–非递归实现类似思路1
def Fibnacci(n):
result = [0,1]
if n <= 1:
return result[n]
for i in range(2,n+1):
result.append(result[i-1]+result[i-2])
return result[n]
思路2:递归的方法 我们知道 n>2 时 斐波那数列 =f(n-1)+f(n-2)
class Solution():
def Fibnacci(self,n):
if n <= 0:
return 0
if n == 1:
return 1
return self.Fibnacci(n-1) + self.Fibnacci(n-2)
题目8:
拓展题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?
答题思路
如果只有1级台阶,那显然只有一种跳法 如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级
如果台阶级数大于2,设为n的话,这时我们把n级台阶时的跳法看成n的函数,记为,第一次跳的时候有2种不同的选择:一是第一次跳一级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为,二是第一次跳二级,此时跳法的数目等于后面剩下的n-2级台阶的跳法数目,即为,因此n级台阶的不同跳法的总数为,不难看出就是斐波那契数列
链接:https://www.jianshu.com/p/965d12083d7f
def Fibnacci(n):
if n <= 2:
return n
result = [0,1, 2]
for i in range(3, n + 1):
result.append(result[i - 1] + result[i - 2])
return result[i]
if __name__=='__main__':
print(Fibnacci(4))
这个无错误
class Solution:
def jumpFloor(self, n):
if n==1 or n==2:
return n
a=1;b=2;c=3
for i in range(3,n+1):
c=a+b;a=b;b=c
return c
为什么用第二种方法的数组不行??
拓展:若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
思路
如果台阶级数为n的话,这时我们把n级台阶时的跳法看成n的函数,记为,第一次跳的时候有n种不同的选择:若是第一次跳一级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为,若是第一次跳m(m<n)级,此时跳法的数目等于后面剩下的n-m级台阶的跳法数目,即为,若是第一次跳n级,此时跳法的数目等于1.所以
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
return 2**(number-1) #直接乘以2
题目10描述:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解析:
类似于青蛙跳台阶,当n=1时,只有一种横向排列的方式。当n等于二时,22有两种选择,横向或者是竖向。当n等于3的时候对于23来说,如果选择的是竖向排列,则剩下的就是22排列,如果选择的是横向,则对于2n剩下的则只有1*n的一种选择。所以依次类推,找到迭代RectCover(target-1)+RectCover(target-2)。
代码和上面一题一样
> `def Fibnacci(n):
if n <= 2:
return n
result = [0,1, 2]
for i in range(3, n + 1):
result.append(result[i - 1] + result[i - 2])
return result[i]
if __name__=='__main__':
print(Fibnacci(4))`
06-斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
- 思路1:非递归实现
直接按照数列数学公式计算-满足时间复杂度 先把n = 0,1,2,这三个项确定了再使用递归斐波那契数列数列从第3项开始,每一项都等于前两项之和数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 23。。。
class Solution:
def Fibonacci(self, n):
if n == 0:
return 0
if n == 1:
return 1
if n == 2:
return 1
if n > 39:
return False
if n >= 3:
a = 1
b = 1
for i in range(n-1):
a,b = b,a+b #这个是重点 复杂赋值 这个都没有用到i 是如何确定他会一直走下去的??
return a
```python
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
result = [0,1]
if n <= 1:
return result[n]
for i in range(2,n+1):
result.append(result[i-1]+result[i-2])
return result[n]
- 方法2–递归实现
class Solution:
def Fibnacci(self, n):
if n <= 0:
return 0
if n == 1:
return 1
return self.Fibnacci(n-1) + self.Fibnacci(n-2)
06-斐波那契数列-拓展1
题目—一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
参考上一题做法
class Solution:
def jumpFloor(self, n):
if n <= 2:
return n
result = [0,1, 2]
for i in range(3, n + 1):
result.append(result[i - 1] + result[i - 2])
return result[n]
若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
直接是2**(n-1)
06-斐波那契数列-拓展2
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
和跳台阶的问题一样的