博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一道算法题(30)——高效的求斐波拉契数列
阅读量:6289 次
发布时间:2019-06-22

本文共 1648 字,大约阅读时间需要 5 分钟。

         对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。

         或者,现在有一栋高楼,但是电梯却出了故障,无奈的你只能走楼梯上楼,根据你的腿长,你一次能走1级或2级楼梯,已知你要走n级楼梯才能走到你的目的楼层,请计算你走到目的楼层的方案数,由于楼很高,所以n的范围为int范围内的正整数。

给定楼梯总数n,请返回方案数。为了防止溢出,请返回结果Mod 1000000007的值。

1.递归    时间复杂度O(2^n)

[java] 
  1. int f(int n){  
  2.     if(n == 1 || n == 2){  
  3.         return 1;  
  4.     }  
  5.     return f(n-1) + f(n-2);  
  6. }  

2.循环    时间复杂度O(n)

[java] 
  1. public int f(int n) {  
  2.     // write code here  
  3.     int f0 = 1;  
  4.     int f1 = 1;  
  5.     int f2 = 0;  
  6.   
  7.     for(int i = 2; i < n; i++){  
  8.         f2 = f0 + f1;  
  9.         f0 = f1;  
  10.         f1 = f2;  
  11.     }  
  12.     return f2;  
  13. }  

3.矩阵求解    时间复杂度O(logn)


    斐波那契的递推公式可以表示成如下矩阵形式:

     根据矩阵的分治算法,可以在O(logn)时间内算出结果。

public class Fibonacci {	static long[][] f = new long[][]{
{0,1},{1,1}}; public int getNthNumber(int n) { if(n == 0) return 1; if(n == 1) return 1; f = pow(n,f); return (int) (f[1][1]%1000000007); } private long[][] pow(int n,long[][] f){//矩阵的幂函数 if(n == 1) return f; if(n == 2) return fun(f,f); if((n&1)==0){//偶数 f = pow(n/2,f); return fun(f, f); } else return fun(pow(n/2,f),pow(n/2 + 1,f)); } private long[][] fun(long[][] f,long[][] m){ long[][] temp = new long[2][2]; temp[0][0] = (f[0][0]*m[0][0] + f[0][1]*m[1][0]); temp[0][1] = (f[0][0]*m[0][1] + f[0][1]*m[1][1]); temp[1][0] = (f[1][0]*m[0][0] + f[1][1]*m[1][0]); temp[1][1] = (f[1][0]*m[0][1] + f[1][1]*m[1][1])%1000000007; return temp; } }

转载于:https://www.cnblogs.com/engineerLF/p/5392991.html

你可能感兴趣的文章
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>