关于斐波那契数列那些事儿~
斐波那契数列
- C语言中:FIB数列
- 中文名:斐波那契数列
- 别名:黄金分割数列,兔子数列
- 该数列:0、1、1、2、3、5、8、13…
- 斐波那契数列以如下被以递推的方法定义:
F (0)=0
F (1)=1
F (n)= F (n - 1)+ F (n - 2)(n ≥ 2)
我们最常见的就是直接题目要求求斐波那契数列的第n项,这类是最简单的.
那么下列所求的斐波那契数列要求有所不同.
1.求斐波那契数列的第n项,答案需要取模le9+7(1000000007),如计算初始结果为:1000000008,请返回1.
class Solution {public int fib(int n) {final int MOD = 1000000007;if(n < 2){return n;}int p = 0, q = 0, r = 1;for(int i = 2; i <= n; i++){p = q;q = r;r = (q + p) % MOD;}return r;}
}
由于斐波那契数列存在速推关系,因此使用动态规划求解
时间复杂度:O(n)
空间复杂度:O(1)
2.经典青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…,求该青蛙跳上一个n级的台阶总共有多少种跳法.
//答案需要取模le9+7(1000000007),如计算初始结果为:1000000008,请返回1
①
class Solution {public int numWays(int n) {if(n == 0 || n == 1){return 1;}int p = 1, q = 1, r = 2;for(int i = 3; i <= n; i++){p = q;q = r;r = (p + q) % 1000000007;}return r;}
}
②
class Solution {public int numWays(int n) {if(n == 0 || n == 1){return 1;}int p = 1, q = 2, r;for(int i = 3; i <= n; i++){r = (p + q) % 1000000007;p = q;q = r;}return q;}
}
③
class Solution {public int numWays(int n) {if(n < 2){return 1;}int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;dp[2] = 2;for(int i = 3; i <= n; i++){dp[i] = dp[i - 1] + dp[i -2];dp[i] = dp[i] % 1000000007;}return dp[n];}
}
不难看出,第①种和第②种代码没多大差别
①~③都是使用动态规划
①和②:时间复杂度O(n)/空间复杂度O(1)
③:时间复杂度O(n)/空间复杂度O(n)
注:
1.如果题目没有要求答案需要取模,那么解题一个方法是可以按照上述,另一个就是改成long方法.
2.不难看出此题和斐波那契数列有一点区别,那就是斐波那契数列是从0开始,即(0,1,1,2…),而此题就是从1开始,即(1,1,2…)
多注意以上小细节那么解决此题就不是难事啦~
//不难观察出一个规律:
//F(i)= 2 * F(i - 1)
class Solution {public int numWays(int n) {if(n == 0){return 0;}int ret = 1;for(int i = 2; i <= n; i++){ret *= 2;}return ret;}
}
//既然是这个规律,那我们不妨再简化一下,运用左移运算符
class Solution {public int numWays(int n) {if(n == 0){return 0;}return 1 << (n - 1);}
}
3.养兔子
解题思路:
不难看出这个题目也是关于斐波那契数列
第一个月和第二个月兔子的数量都是1
第三个月兔子数量是2
第四个月兔子数量是3
第五个月兔子数量是5
…
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();System.out.println(GetNum(n));}}public static Map<Integer, Long> map = new HashMap<>();public static long GetNum(int n){if(n == 1 || n == 2){return 1;}else{if(map.containsKey(n)){return map.get(n);}else{map.put(n, GetNum(n - 1) + GetNum(n - 2));}return map.get(n);}}
}
未完待续~
关于斐波那契数列那些事儿~相关推荐
- c语言 兔子数列螺线图,经典算法大全51例——2.斐波那契数列(兔子数列)
经典算法大全51例--2.斐波那契数列 算法目录合集 地址 说明 题目 原理分析 代码实现--Java 相关题目其他变形: 1.爬楼梯(来源:力扣LeetCode) 2.兔子成熟期拉长 官方题解 分析 ...
- java 斐波拉_Java实现斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- 剑指offer:面试题10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...
- 用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- 循环斐波那契数列_剑指offer #10 斐波那契数列
(递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...
- 用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?
自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项:若不在,则返回-1 #include <stdio.h> long gen ...
- 算法(1)斐波那契数列
1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...
- NOIP模拟题 斐波那契数列
题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...
- 剑指offer_第7题_斐波那契数列
题目描述 现在要求输入一个整数n 输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 理解 斐波那契数列 因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...
最新文章
- ie8 script445: 对象不支持此操作_经验总结:上海增值税认证勾选安装和操作步骤...
- 【转载】“银弹”Hack(IE6、7、8beta1)
- 【Docker】Docker Compose 文件和 Docker 兼容性
- asp.net mvc webform和razor的page基类区别
- AT4 more about the sphere
- unity文字特殊效果
- 用ajax实现图片上传 帮你简单快速学会使用
- 社交APP市场泥沙俱下,怎能脱颖而出
- 为知笔记保存为html,为知笔记使用方法
- OpenEmbedded 简介
- 万顿思电商:拼多多推广是如何收费的?
- 【培训实验记录】锐捷SDN交换机和控制器部署
- 计算机专业支教,【计算机】梦缘·夏季支教志愿招募
- 试发贴:央视《焦点访谈》曝光淘宝网纵容售假
- Python爬虫自学笔记(三)动态网页爬取
- Java建造者模式(Builder pattern)
- Flash Builder 入门
- VS2010 与 glut freeglut GLtools glew等 配置教程
- Java毕设项目电竞教育公司(java+VUE+Mybatis+Maven+Mysql)
- 在浏览器访问不到在阿里云购买服务器的公网ip的解决历程