描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
下面是 斐波那契数列 的表达式。
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
示例1
输入: 4 返回值: 3
思路
其实思路很明显,就是 斐波那契数列 本身的定义, F(0) = 0, F(1) = 1, F(N) = F(N - 1) + F(N - 2)。
当n >= 2 时,每个数字都是其前面两个数字之和。可以运用动态规划的思想来写这道题。
方法一
可以使用数组来存储每次的数值。最后取值的时候直接取数组小标为 n 对应的值即可。
AC代码
public int Fibonacci(int n) {
if (n < 0) {
return 0;
}
// 当 n 为 0 或 1 时,直接返回它本身即可
if (n == 0 || n == 1) {
return n;
}
// 创建一个数组
int[] dp = new int[n + 1];
// 初始化下标为 0 和 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),N 为数值大小
空间复杂度:O(N)
方法二
大家看上面的方法有没有可以优化的地方。大家可以发现其实每次它只是依赖于前面两个数值,并不用把所有的都需要存储起来。
public int Fibonacci(int n) {
if (n < 0) {
return 0;
}
// 当 n 为 0 或 1 时,直接返回它本身即可
if (n == 0 || n == 1) {
return n;
}
// 同理,先初始化前两个
int dp_0 = 0;
int dp_1 = 1;
// 用来存储最终结果
int result = 0;
// 开始遍历
for (int i = 2; i <= n; i ++) {
// 结果 = 前两个之和
result = dp_0 + dp_1;
// 替换
dp_0 = dp_1;
dp_1 = result;
}
// 返回
return result;
} 时间复杂度:O(N),N 为数值大小
空间复杂度:O(1)
最后
这道题运用了动态规划的思想,可以在空间复杂度为O(1)的情况下实现。
大家可以去 【牛客网-题库-在线编程】去练习一下。
可以去微信搜索:【蘑菇睡不着】交个朋友~
也可以扫描下方二维码。

京公网安备 11010502036488号