当前位置: 首页 > news >正文

剑指offer10-I.斐波那契数列

 学计算机的对这道题肯定不陌生,我记得是学C语言的时候学递归的时候有这道题,于是我就世界用递归写了如下代码:

class Solution {public int fib(int n) {if(n==1) return 1;if(n==0) return 0;return (fib(n-1) + fib(n-2)) % 1000000007;}
}

到n=44就算不出了,超时了。就看了一下题解,题解用的是动态规划的方法:

class Solution {public int fib(int n) {if(n<2){return n;}int p=0,q=1;int r =0;for(int i =2;i<=n;i++){r = (p+q) % 1000000007;p = q;q = r;       }return r;}
}

n小于2的话返回自己,然后定义p为n的前两个数,q为n的前一个数,然后r是第n个数的值,所以r就等于p+q,然后把q给p,r给q,最后返回r就可以了。

题解还给出了一种矩阵幂的方法:

 最后只需要求M的n次方就行。

class Solution {static final int MOD = 1000000007;public int fib(int n) {if (n < 2) {return n;}int[][] q = {{1, 1}, {1, 0}};int[][] res = pow(q, n - 1);return res[0][0];}public int[][] pow(int[][] a, int n) {int[][] ret = {{1, 0}, {0, 1}};while (n > 0) {if ((n & 1) == 1) {ret = multiply(ret, a);}n >>= 1;a = multiply(a, a);}return ret;}public int[][] multiply(int[][] a, int[][] b) {int[][] c = new int[2][2];for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {c[i][j] = (int) (((long) a[i][0] * b[0][j] + (long) a[i][1] * b[1][j]) % MOD);}}return c;}
}

定义了一个矩阵乘矩阵的multiply方法,求矩阵的n次方的pow方法,通过这两个方法可以求出M的n次方。

http://www.lryc.cn/news/101753.html

相关文章:

  • 13年测试经验,性能测试-压力测试指标分析总结,看这篇就够了...
  • 大数据课程D3——hadoop的Source
  • F5 LTM 知识点和实验 4-持久化
  • SpringBoot之WebMvcConfigurer详解
  • WPF实战学习笔记22-添加自定义询问窗口
  • Spring Boot项目的创建
  • Python加载数据的5种方法
  • QPoint、QLine、QSize、QRect
  • vue+leaflet笔记之地图量测
  • “深入理解SpringBoot:从入门到精通的几个关键要点“
  • 数值线性代数: 共轭梯度法
  • 【JVM】详解对象的创建过程
  • 华纳云:ubuntu下如何搭建nfs服务
  • HCIA实验二
  • stm32 舵机 cubemx
  • 无涯教程-jQuery - Spinner组件函数
  • Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
  • docker基于centos7镜像安装python3.7.9
  • JavaScript中的switch语句
  • Jquery笔记
  • 【C++】优先级队列的基本概念以及其模拟实现
  • TextClamp for Vue3.0(Vue3.0的文本展开收起组件)
  • 区间预测 | MATLAB实现VAR向量自回归时间序列区间预测
  • 在 Windows 上搭建 NTP 服务器
  • 应急响应经典案例-FTP 暴力破解
  • 41. linux通过yum安装postgresql
  • SpringBoot启动流程及自动配置
  • 【Linux】进程轻松入门
  • 【使用时空RBF-NN进行非线性系统识别】实现了 RBF、分数 RBF 和时空 RBF 神经网络,用于非线性系统识别研究(Matlab代码实现)
  • Tomcat 安装配置教程及成功后,启动失败报错解决方案