从小白开始刷算法 递归篇 leetcode.509

简介: 从小白开始刷算法 递归篇 leetcode.509

509. 斐波那契数


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


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

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

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


示例 1:


输入:n = 2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:


输入:n = 3

输出:2

解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:


输入:n = 4

输出:3

解释:F(4) = F(3) + F(2) = 2 + 1 = 3


题目来源:力扣(LeetCode)


递归思路


能否写出:能写出。

时间:10多分钟

思路:

斐波那契数列是一个非常经典的递归题目。用来入门递归非常好。记得我第一次使用递归就是斐波那契数列和叠盘子。

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


// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public int fib(int n) {
        if (n < 2) {
            return n == 1 ? 1 : 0;
        }
        return fib(n - 1) + fib(n - 2);
    }
}

时间复杂度: O(2^n),其中 n 是斐波那契数列的索引。每次递归调用会产生两个分支,指数级地增长。


空间复杂度:O(n),递归调用的栈空间取决于递归深度,最坏情况下需要存储 n 个函数调用的信息。


递归解法在计算斐波那契数列时存在重复计算的问题,导致时间复杂度指数级增长。因此,尽管递归是一种直观的解法,但在实际应用中,为了获得更高效的计算,可以采用迭代、动态规划或记忆化递归等其他方法来计算斐波那契数列。


其他思路:


虽然是动态规划


class Solution {
    public int fib(int n) {
        if (n < 2) {
            return n;
        }
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

时间复杂度:O(n),需要计算第 0 到第 n 个斐波那契数,每个斐波那契数的计算都需要常数时间。

空间复杂度:O(n),需要一个长度为 n+1 的数组来存储中间结果。

相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
43 0
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
50 2
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
29 2
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
33 1
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
53 0
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
4月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
54 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
64 1