斐波那契数列-剑指Offer(Java语言)
2019-02-24 09:29
357 查看
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路:
方法一
因为n比较小,可以考虑用递归
[code]public class Solution { public int Fibonacci(int n) { if(n==0) return 0; else if(n==1||n==2) return 1; else return Fibonacci(n-1)+Fibonacci(n-2); } }
方法二
方法一这样会出现很多重复计算,为了降低时间可以考虑用哈希表保存计算结果,这里用数组作为哈希表。fib
为第n项的值
[code]public class Solution { int[] fib=new int[40];//哈希数组 public int Fibonacci(int n) { if(n==0) return 0; else if(n==1||n==2) return 1; else if(fib !=0) return fib ; else { fib =Fibonacci(n-1)+Fibonacci(n-2);//保存计算结果 return fib ; } } }
方法三
假如题目没有规定n<=39,则使用方法二不好定义哈希数组的长度,可以用map来保存计算结果
[code]import java.util.HashMap; public class Solution { HashMap<Integer,Integer> map=new HashMap<>(); public int Fibonacci(int n) { if(n==0) return 0; else if(n==1||n==2) return 1; else{ Integer t=map.get(n); if(t==null){ map.put(n,Fibonacci(n-1)+Fibonacci(n-2)); return map.get(n); }else{ return t; } } } }
方法四
使用非递归方法
用变量n_1表示当前项的前一项,n_2表示当前项的前两项,则当前项的值为n_1+n_2
[code]public class Solution { public int Fibonacci(int n) { if(n==0) return 0; else if(n==1||n==2) return 1; else{ int ret=0,n_1=1,n_2=1; for(int i=3;i<=n;i++){ ret=n_1+n_2; n_2=n_1; n_1=ret; } return ret; } } }
相关文章推荐
- 剑指Offer面试题9(java版):斐波那契数列
- 链表中倒数第k个结点-剑指Offer(Java语言)
- 斐波那契数列递归与非递归实现(JAVA语言描述)
- 反转链表-剑指Offer(Java语言)
- 树的子结构-剑指Offer(Java语言)
- 合并两个排序的链表-剑指Offer(Java语言)
- 二叉树的镜像-剑指Offer(Java语言)
- JAVA实现斐波那契数列问题(《剑指offer》)
- 跳台阶-剑指Offer(Java语言)
- 栈的压入、弹出序列-剑指Offer(Java语言)
- 变态跳台阶-剑指Offer(Java语言)
- 顺时针打印矩阵-剑指Offer(Java语言)
- 《剑指offer》牛客网java题解-斐波那契数列
- 包含min函数的栈-剑指Offer(Java语言)
- 从上往下打印二叉树-剑指Offer(Java语言)
- 矩形覆盖-剑指Offer(Java语言)
- 二叉搜索树的后序遍历序列-剑指Offer(Java语言)
- 剑指Offer(java版)斐波那契数列 ——1,1,2,3,5,8......
- 二叉树中和为某一值的路径-剑指Offer(Java语言)
- 剑指offer面试题10:斐波那契数列(Java 实现)