2023年2月9日,算法刷题计划继续
摆烂了四个月,自从实习之后。下班回来就不想再学习,寒假又放飞自我了,再不开始就结束了,最晚5月就要开始投简历找工作了,还要不到3个月,快让我长点心吧!!!!!
题目
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
首先常规的我能想到的就是递归的方式,因为 f0 和 f1 固定,就是0和1,公式也给出来了,那直接就可以写递归了
class Solution {
public int fib(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
int x = 0;
x = fib(n - 1) + fib(n - 2);
return x;
}
}
}
但是这样效率太低了,执行用时比较长,所以用动态规划的思想,准备一个int数组,来从0开始记录每一个斐波那契数,用一个for循环,实现最后一次循环是求所需的斐波那契数,这样只需要返回最后求出的结果就可以了。
PS:代码中定义数组大小为n+2的原因是:我至少需要两个位置来定义 f0 和 f1 的值,n+2可以保证即使传进来的n为0,也不会在设置数组中前两个数的时候发生数组越界的问题。
class Solution {
public int fib(int n) {
int[] dp = new int[n + 2];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}