力扣打卡之斐波那契数列

题目描述

求取斐波那契数列第n位的值

斐波那契数列就是除了第一位和第二位,其余所有的数都等于前两位数据的和!

解题思路

我们在这里有三种解法:

①暴力求解

我们可以直接使用暴力破解的方式进行求解

②去重暴力求解

从上面我们可以看到这种方法有什么不足?

是不是发现前面计算过的数据后面再次计算了

那我们可以用什么方法来减少计算?可以采用去重的方式 

③双指针迭代

我们使用双指针,指向数据,最后求解 

代码展示

①暴力求解

class Solution{
public static void main(String[] args){
    
    System.out.println(caculation(10));
    
}
public static int caculation(int num){
    //在这里我们首先要把特殊情况提取出来!
    if(num==0){
        return 0;
    }
    if(num==1){
        return 1;
    }
    return caculation(num-1)+caculation(num-2);
}
}


/*
最后的输出结果为55
*/

时间复杂度为 O(2^n)

②去除暴力求解

去重暴力求解就是添加一个去重的代码,其余的其实和上面很相似,下面代码可以详细看

class Solution{
public static void main(String[] args){
    
    System.out.println(caculation2(10));
    
}
public static int caculation2(int num){
   int []arr=new arr[num+1];
   return solutionQuestion(arr,num);
}

public static int solutionQuestion(int[] arr,int num){
     //在这里我们首先要把特殊情况提取出来!
    if(num==0){
        return 0;
    }
    if(num==1){
        return 1;
    }
    //在这里实现了去重!!我们使用数组将元素存储起来,如果当前数组中存在这个元素的话就直接拿取,否则就需要计算
    if(arr[num]!=0){
        return arr[num];
    }
    arr[num]=arr[num-1]+arr[num-2];
    return arr[num];
    
}
}

时间复杂度为O(n)

空间复杂度也为O(n)

③双指针迭代

class Solution{
    public static void main(String[] args){
        System.out.println(iterate(10));
    }
    public static int iterate(int num){
        if(num==0) return 0;
        if(num==1) return 1;
        int low=0,high=1;
        for(int i=2;i<=num;i++){
            int sum=high+low;
            low=high;
            high=sum;
        }
        return high;
    }  
}

/*
    最后的输出结果为55
*/

双指针迭代的时间复杂度为O(n),但是它的空间复杂度为O(1)

所以相比于去重暴力求解也有了一定的改进!!

<think>好的,我现在需要处理用户关于C++实现斐波那契数列LeetCode题目及解答的查询。首先,用户提到了几个引用,我需要仔细查看这些引用内容,确保回答准确并正确引用。 首先,用户提供的引用1到4都涉及斐波那契数列的动态规划实现,尤其是C++和Python的代码示例。引用3提到递归方法的效率问题,引用4则讨论了LeetCode上的动态规划解法。用户的问题明确要求查找LeetCode题目及C++的解答,因此我需要整合这些信息。 接下来,我需要确定LeetCode中相关的题目编号。根据引用1和4提到的#509题,这应该是主要的题目。然后,我需要提供题目描述,并给出对应的C++解决方案。同时,用户可能希望了解不同的方法,如递归、动态规划和优化后的动态规划,所以需要覆盖这些方面,并指出各自的优缺点,特别是递归的效率问题,如引用3所述。 在编写回答时,需要遵循用户提供的系统级指令,包括使用正确的中文,数学公式的格式,以及引用标识。例如,斐波那契数列的定义需要用行内公式$F(n) = F(n-1) + F(n-2)$,而独立公式可能需要用$$...$$,不过根据示例来看,用户可能更倾向于行内公式。此外,每个引用的末尾需要添加对应的引用标识,如[^1]、[^3]等。 另外,用户要求生成相关问题,我需要根据内容提出三个相关问题,例如关于不同方法的比较、时间复杂度的分析,或者应用场景。这些问题需要与斐波那契数列的实现和优化相关,确保有针对性。 最后,需要检查代码的正确性,特别是C++部分,确保代码在LeetCode上可以通过,同时注意引用3中提到的递归方法在n较大时超时的问题,因此需要强调动态规划的优势。此外,可能需要提到矩阵快速幂或通项公式作为进一步的优化,但根据引用内容,用户提供的资料中没有这些,所以可能暂时不深入,或者简单提及。 总结步骤: 1. 确定LeetCode题目编号为509,并描述题目要求。 2. 提供三种方法:递归(低效)、动态规划(高效)、优化空间的动态规划。 3. 分析各方法的时间复杂度,引用相关文献说明递归的问题。 4. 添加相关问题,确保符合用户要求。 5. 正确使用引用标识,确保每个引用来源对应正确的内容。 需要验证每个代码片段是否正确,特别是动态规划部分,避免错误。例如,递归方法在n大时确实会有重复计算,动态规划通过存储中间结果来优化。同时,空间优化版本只需两个变量,降低空间复杂度。 最后,确保回答结构清晰,分点说明,代码用正确的格式包裹,引用标识自然添加在对应的解释后面。</think>### C++ 实现斐波那契数列LeetCode 题目及解答 #### LeetCode 题目 #509. 斐波那契数 **题目描述**: 写一个函数,输入 $n$ ,返回斐波那契数列的第 $n$ 项 $F(n)$。斐波那契数列定义为: $$ F(0) = 0, \quad F(1) = 1, \quad F(n) = F(n-1) + F(n-2) \quad (n \geq 2) $$ 要求时间复杂度尽可能低。 --- #### C++ 解答及分析 ##### 1. 递归方法(低效,不推荐) **问题**:递归会导致大量重复计算,时间复杂度为 $O(2^n)$,当 $n$ 较大时会超时。 ```cpp class Solution { public: int fib(int n) { if (n == 0) return 0; if (n == 1 || n == 2) return 1; return fib(n-1) + fib(n-2); } }; ``` ##### 2. 动态规划方法(高效) **思路**:用数组存储中间结果,避免重复计算,时间复杂度 $O(n)$,空间复杂度 $O(n)$[^1][^4]。 ```cpp class Solution { public: int fib(int n) { if (n <= 1) return n; int dp[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]; } }; ``` ##### 3. 优化空间的动态规划 **思路**:仅用两个变量存储前两项,空间复杂度优化为 $O(1)$[^3]。 ```cpp class Solution { public: int fib(int n) { if (n <= 1) return n; int prev = 0, curr = 1; for (int i = 2; i <= n; i++) { int next = prev + curr; prev = curr; curr = next; } return curr; } }; ``` --- #### 关键点总结 - **递归方法**:直观但效率低,适用于教学演示,实际应用需避免。 - **动态规划**:通过存储中间结果显著提升效率,是标准解法。 - **空间优化**:进一步减少内存占用,适合资源受限的场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值