【剑指offer】斐波那契数列

在这里插入图片描述
题解思路

  • 暴力,简单的递归
  • 优化递归算法_1
    • 由于我们一直输入的n<=39,所以我们可以打个表
    • 将前40项的结果存在数组中,减少方法1中的重复计算
  • 优化递归算法_2
    • 虽然方法2的计算次数减少了,但是我们多开辟了39个空间,造成浪费
    • 我们支开辟每次参与运算的两个数的空间,减少空间浪费

Java

1、暴力

public class Solution {
    public int Fibonacci(int n) {
        if(n<=1){
            return n;
        }
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

2、优化递归_1

public class Solution {
    public int Fibonacci(int n) {
        int [] ans = new int [40];
        ans[0]=0;
        ans[1]=1;
        for(int i = 2;i<40;i++){
            ans[i]=ans[i-1]+ans[i-2];
        }
        return ans[n];
    }
}

3、优化递归_2

public class Solution {
    public int Fibonacci(int n) {
        if( n == 0){
            return 0;
        }else if(n == 1){
            return 1;
        }
        int sum = 0;
        int one = 0;
        int two = 1;
        for(int i = 2;i<=n;i++){
            sum=one+two;
            one = two;
            two = sum;
        }
        return sum;
    }
}

Python

1、暴力(这个是过不了的,时间太长了)只要了解思路即可,直接跳到第二个

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        if n<=1:
            return n;
        return self.Fibonacci(n-1)+self.Fibonacci(n-2);
        # write code here

2、优化递归_1

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        a = [0,1];
        for i in range(2,40):
            a.append(a[i-1]+a[i-2]);
        return a[n];
        # write code here

3、优化递归_2

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        a = 0;
        b = 1;
        for i in range (n):
            a,b = b, a+b;
        return a;
        # write code here

注意,我们在平时做题的时候不提倡暴力,但是在比赛过程中还是可以使用的
同样如果你们纠结到底是优先考虑时间效率还是空间效率,那肯定是时间效率
我们一贯的做法是牺牲空间来换取时间(一个最简单的例子就是一些超大型计算机),前人们优先追求的是时间上的优化,当然二者兼顾最好

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值