斐波那契数列相关

博客讨论了如何高效地计算泰波那契数列的第N项。首先介绍了暴力递归解法,但因其时间复杂度为2^n而被舍弃。接着,提出了去重递归的方法,通过存储已计算值降低空间复杂度到O(n)。最后,引入双指针算法,仅用三个变量实现,达到O(1)的空间复杂度。这种方法通过不断更新两个变量的值来获取第N个泰波那契数。
摘要由CSDN通过智能技术生成

目录

1.求取斐波那契数列第N位的值

1.暴力解法 

2.去重递归

3. 双指针算法(两个变量保存俩个值,然后不断地修改这俩个值)


1.求取斐波那契数列第N位的值

斐波那契数列:每一位的值等于他前俩位数字之和,前俩位固定

力扣相似题 

1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:

输入:n = 25
输出:1389537

1.暴力解法 

class Solution {
    public int tribonacci(int n) {
    //和斐波那契数列相似
    if(n==0)return 0;
    if(n==1||n==2)return 1;
    return tribonacci(n-1)+tribonacci(n-2)+tribonacci(n-3);
    }
}

 这样写的话会提示超出时间限制,时间复杂度为2^n

 

2.去重递归

 经过画图,可以看出,其实只要计算左边红色部分即可,右边不需要递归,时间复杂度为o(n),但是空间复杂度也是O(n)

 

class Solution {
    public int tribonacci(int n) {
    //和斐波那契数列相似
    //这种解法时间复杂度为(2^n)
    // if(n==0)return 0;
    // if(n==1||n==2)return 1;
    // return tribonacci(n-1)+tribonacci(n-2)+tribonacci(n-3);


    //创建一个数组保存遍历过的数值,因为斐波那契数列从零开始,所以数组长度为n+1
    int[] arr=new int[n+1];
    return recurse(arr,n);
    }
     private static int recurse(int[] arr,int n){
     if(n==0)return 0;
    if(n==1||n==2)return 1;
    if(arr[n]!=0){
        return arr[n];
    }
    arr[n]= recurse(arr,n-1)+recurse(arr,n-2)+recurse(arr,n-3);
     return arr[n];
    }
}

3. 双指针算法(两个变量保存俩个值,然后不断地修改这俩个值)

前面的数组保存了n长度的数,实际上没有必要存储,只需要存储俩个元素就可以,不用占用那么长的空间

这里只需要让low,high保存值就可以,下一次执行num[1]、num[2] 

class Solution {
    public int tribonacci(int n) {
 //双指针算法
     if(n==0)return 0;
    if(n==1||n==2)return 1;
    int low =0,mid=1,high=1;
    for(int i=3;i<=n;i++){
        int sum=low+high+mid;
        low =mid;
        mid=high;
        high=sum;
    }
  return high;  
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值