剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- I. 斐波那契数列

📆Date: 2023年3月13日

✒️Author: SmartBoy

📓Classify:LeetCode

🔖Language: Java

✨题目描述:

  • 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1

示例 2:

输入:n = 5
输出:5

提示:

  • 0 <= n <= 100

🎉解题思路:

同爬楼梯题目思路一样

均可利用递归和循环的思路解决。

🥇Java源码:

package LeetCodePro.Problem2;

import java.util.Scanner;

/**
* @Auther:Xust_SmartBoy
* @Date:2023/3/13 20:01
* @Description:LeetCodePro.Problem2
* @User:SmartBoy
* @VERSON:
* 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
*
* F(0) = 0,   F(1) = 1
* F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
* 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
*
* 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
*
*
*
* 示例 1:
*
* 输入:n = 2
* 输出:1
* 示例 2:
*
* 输入:n = 5
* 输出:5
*/

public class Problem2 {
   public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       System.out.println("请输入n的值:");
       int n = scanner.nextInt();
       Solution1 solution1 = new Solution1();
       Solution2 solution2 = new Solution2();
       Solution3 solution3 = new Solution3();

//        System.out.println("F(N) =" + solution1.fib(n));
//        System.out.println("F(N) =" + solution2.fib(n));
       System.out.println("F(N) =" + solution3.fib(n));

   }
}

package LeetCodePro.Problem2;

/**
* @Auther:Xust_SmartBoy
* @Date:2023/3/13 20:01
* @Description:LeetCodePro.Problem2
* @User:SmartBoy
* @VERSON:
*/

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

package LeetCodePro.Problem2;

import java.util.HashMap;
import java.util.Map;

/**
* @Auther:Xust_SmartBoy
* @Date:2023/3/13 20:05
* @Description:LeetCodePro.Problem2
* @User:SmartBoy
* @VERSON:递归
*/

public class Solution2 {
   private Map<Integer,Integer> map = new HashMap<>();
   public int fib(int n){
       if (n == 0)
           return 0;
       if (n == 1){
           return 1;
       }
       if (map.get(n) != null){
           return map.get(n) % 1000000007;
       }
       else {
           map.put(n,fib(n -2)+ fib(n -1));
           return map.get(n) % 1000000007;
       }
   }
}


package LeetCodePro.Problem2;

/**
* @Auther:Xust_SmartBoy
* @Date:2023/3/13 20:18
* @Description:LeetCodePro.Problem2
* @User:SmartBoy
* @VERSON:循环
*/

public class Solution3 {
   public int fib(int n){
       if (n == 0)
           return 0;
       if (n == 1)
           return 1;
       int result = 0;
       int pre = 1;
       int prePre = 0;
       for (int i = 2; i <= n ; i++) {
           result = pre + prePre;
           prePre = pre % 1000000007;
           pre = result % 1000000007;
       }
       return result % 1000000007;
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值