斐波那契数列 ゝ一纸荒年。 2022-10-29 06:26 34阅读 0赞 \#\#题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 ### 思路 ### 1. 递归(函数栈调用消耗太高) 时间复杂度O(2^n),空间复杂度O(n)。 2. 使用循环替换递归 时间复杂度O(n),空间复杂度O(1)。 3. 动态规划 时间复杂度O(n),空间复杂度O(1)。 4. 矩阵快速幂 ![1805130-20200215163227344-1078661951.png][] ![1805130-20200215163236520-1637915881.png][] 时间复杂度O(lgn),空间复杂度O(1)。 ### 递归算法 ### public class Solution { public int Fibonacci(int n) { if(n < 0) return 0; if(n < 2) return n; return Fibonacci(n-1)+Fibonacci(n-2); } } ### 循环算法 ### public class Solution { public int Fibonacci(int n) { int a = 0, b = 1, c = 1; while(n-- > 0) { a = b; b = c; c = a + b; } return a; } } ### 动态规划 ### public class Solution { public int Fibonacci(int n) { int[] dp = new int[] {0, 1}; while(n-- > 0) { dp[1] = dp[0] + dp[1]; dp[0] = dp[1] - dp[0]; } return dp[0]; } } ### 矩阵快速幂 ### class Solution { private int[][] matmul(int[][] a, int[][] b, int m, int n, int t) { int[][] tmp = new int[m][n]; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { tmp[i][j] = 0; for(int k = 0; k < t; k++) { tmp[i][j] += a[i][k] * b[k][j]; } } } return tmp; } public int Fibonacci(int n){ if(n < 1) return 0; if(n == 1) return 1; int[][] matT = new int[][] { {1, 1}, {1, 0}}; int[][] fibT = new int[][] { {1}, {0}}; while(n > 1){ // 二进制转换,最高位1用最终快速幂矩阵,其余位1用当前幂矩阵 if(n%2 == 1){ fibT = matmul(matT, fibT, 2, 1, 2); } matT = matmul(matT, matT, 2, 2, 2); n /= 2; } fibT = matmul(matT, fibT, 2, 1, 2); return fibT[1][0]; } } ### 简单快速幂求2的n次方 ### class Solution { public long pow(int n) { long ans = 1, base = 2; while(n > 0) { if(n%2 == 1) { ans = (ans * base) % 1000000007; } base = (base * base) % 1000000007; n >>= 1; } return ans; } } ### 笔记 ### 1.快速幂余项的个数联想二进制权重 2.循环实现,三次赋值,一次加法 dp实现,两次赋值,一次加法,一次减法 后者效率未见得高 3.尾递归优化 [1805130-20200215163227344-1078661951.png]: /images/20221024/a9e998007ab247a28cd8a2bae3b2da4f.png [1805130-20200215163236520-1637915881.png]: /images/20221024/d936d968509a4701930bbbb5143ec138.png
相关 斐波那契数列 斐波那契数,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2, Love The Way You Lie/ 2022年11月19日 04:15/ 0 赞/ 235 阅读
相关 斐波那契数列 斐波那契数列 描述 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 £神魔★判官ぃ/ 2022年11月10日 10:54/ 0 赞/ 48 阅读
相关 斐波那契数列 \\题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 思路 1. 递归(函数栈调用消耗 ゝ一纸荒年。/ 2022年10月29日 06:26/ 0 赞/ 35 阅读
相关 斐波那契数列 // 斐波那契数列.cpp : 定义控制台应用程序的入口点。 // \include "stdafx.h" \include<iostream> usin 谁践踏了优雅/ 2022年08月23日 14:45/ 0 赞/ 63 阅读
相关 斐波那契数列 关于斐波那契数列的解法,本人找到了一种比较简单的方法,结果是正确的,不知道各位有没有另外更好的解法,一起探讨探讨。 import java.util.; pu ╰+攻爆jí腚メ/ 2022年08月01日 12:15/ 0 赞/ 352 阅读
相关 斐波那契数列 定义:斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列从第三项开始,每一项都等于前两项之和。 矫情吗;*/ 2022年07月13日 04:49/ 0 赞/ 307 阅读
相关 斐波那契数列 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597, 冷不防/ 2022年07月13日 03:19/ 0 赞/ 326 阅读
相关 斐波那契数列 class FibIter(object): def __init__(self, lenth): self.lent 一时失言乱红尘/ 2022年05月27日 13:51/ 0 赞/ 324 阅读
相关 斐波那契数列 include<iostream> using namespace std; int fibonacci1(int t) { if(t 古城微笑少年丶/ 2022年05月09日 08:58/ 0 赞/ 289 阅读
相关 斐波那契数列 ![1234096-20171112230708606-1911525192.png][] 转载于:https://www.cnblogs.com/ostrich-sugar た 入场券/ 2022年01月06日 23:41/ 0 赞/ 351 阅读
还没有评论,来说两句吧...