当前位置:   article > 正文

Leetcode 509:斐波那契数_斐波拉切数 leetcode

斐波拉切数 leetcode

题目描述:

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给你 n ,请计算 F(n) 。

解法一:递归

思路:

斐波那契数列的数学形式就是递归,当前项的和等于前两项的数字之和。

代码如下:

  1. class Solution {
  2. public int fib(int n) {
  3. // 特殊情况
  4. if (n == 0 || n == 1) {
  5. return n;
  6. }
  7. // 递推关系
  8. return fib(n - 1) + fib(n - 2);
  9. }
  10. }

不足:存在大量的重复计算,如下图:

 

 

解法二:带有备忘录的递归算法

思路:

既然递归存在大量重复计算,那就通过记忆的方式解决重复的问题。初始化一个数组值全部为0,判断当前位置的值是否为0,如果为0,则进行递归计算;如果不为0,则不用计算。

代码如下:

  1. class Solution {
  2. public int fib(int n) {
  3. //备忘录数组
  4. int[] nums = new int[n+1];
  5. return memoryFib(nums, n);
  6. }
  7. public int memoryFib(int[] nums, int n){
  8. //递归退出的条件
  9. if(n == 0 || n == 1){
  10. return n;
  11. }
  12. //如果nums[n]的值为0,则递归;如果不为0,则值为原值
  13. return nums[n] == 0 ? memoryFib(nums, n-1) + memoryFib(nums, n-2) : nums[n];
  14. }
  15. }

解法三:动态规划

思路:

如下图:

斐波那契额数列的数学形式如下:

 

状态转移方程: dp[i] = dp[i - 1] + dp[i - 2] 

代码如下:

  1. class Solution {
  2. public int fib(int n) {
  3. //处理n为0的情况
  4. if(n == 0){
  5. return 0;
  6. }
  7. //初始化dp数组
  8. int[] dp = new int[n+1];
  9. dp[0] = 0;
  10. dp[1] = 1;
  11. for(int i=2; i <= n; i++){
  12. dp[i] = dp[i-1] + dp[i-2];
  13. }
  14. return dp[n];
  15. }
  16. }

解法四:迭代算法

思路:

动态规划确实效率挺高,但是使用了额外的空间。迭代算法可以在不使用额外空间的前提下,完成斐波那契数列的计算。

代码如下:

  1. class Solution {
  2. public int fib(int n) {
  3. //处理特殊情况
  4. if(n == 0){
  5. return 0;
  6. }
  7. if(n ==1 || n ==2){
  8. return 1;
  9. }
  10. int num1 = 1, num2 = 1;
  11. for(int i=2; i < n; i++){
  12. //暂存num2
  13. int temp = num2;
  14. num2 = num1 + num2;
  15. num1 = temp;
  16. }
  17. return num2;
  18. }
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/573482
推荐阅读
相关标签
  

闽ICP备14008679号