大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
【1】递归,重复计算太多,时间复杂度是n的指数级,超过题目给定的时间
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n == 0:
return 0
elif n == 1:
return 1
else:
return self.Fibonacci(n-1)+self.Fibonacci(n-2)
改进:把之前的计算结果存起来,避免重复计算
【2】自下往上循环,时间复杂度o(n)
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
re = [0,1]
while len(re)<=n:
re.append(re[-1]+re[-2])
return re[n]
【3】动态规划
class Solution {
public:
int Fibonacci(int n) {
int f = 0, g = 1;
while(n--) {
g += f;
f = g - f;
}
return f;
}
};
【4】尾递归
function tailFibonacci(n, ac1, ac2){
if(n==0) { return 0; }
if(n ==1 || n== 2) { return ac2 };
return tailFibonacci (n - 1, ac2, ac1 + ac2);
}
function Fibonacci(n){
return tailFibonacci(n, 1 , 1);
}
【5】柯里化
function currying(fn, n1, n2) {
return function (m) {
return fn.call(this, m, n1, n2);
};
}
function tailFibonacci(n, ac1, ac2){
if(n==0) { return 0; }
if(n ==1 || n== 2) { return ac2 };
return tailFibonacci (n - 1, ac2, ac1 + ac2);
}
function Fibonacci(n){
return currying(tailFibonacci,1,1)(n);
}
【*】矩阵公式,时间复杂度o(log n)
=青蛙跳台阶===
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
【1】自下向上循环
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
re = [0,1,2]
while len(re)<=number:
re.append(re[-1]+re[-2])
return re[number]