目录
3. 双指针算法(两个变量保存俩个值,然后不断地修改这俩个值)
1.求取斐波那契数列第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; } }