斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。
示例 1:输入:2 输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:输入:3 输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:输入:4 输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
提示:0 ≤ N ≤ 30
我的思路:利用递归的思想解决问题
我的解法:
class Solution {
public int fib(int N) {
if(N == 0) return 0;
if(N == 1) return 1;
return fib(N - 1) + fib(N - 2);
}
}
执行用时 :22 ms, 在所有 Java 提交中击败了5.00%的用户
内存消耗 :33.6 MB, 在所有 Java 提交中击败了49.25%的用户
很显然,除了N等于0和1外,每次执行都需要进行大量的重复运算,程序执行时间过长,时间复杂度低,需改进。
参考思路:
方法一:数组法(操纵数组,效率比操作整型低一点)
class Solution {
public int fib(int N) {
if(N < 2){
return N;
}
int[] arr = new int[N + 1];
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i <= N; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[N];
}
}
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :34 MB, 在所有 Java 提交中击败了47.95%的用户
方法二:替换法(效率最高,内存消耗都差不多)
class Solution {
public int fib(int N) {
if(N < 2){
return N;
}
int a1 = 0;
int a2 = 1;
int a3 = 0;
for(int i = 2; i <= N; i++){
a3 = a1 + a2;
a1 = a2;
a2 = a3;
}
return a3;
}
}
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :34 MB, 在所有 Java 提交中击败了47.95%的用户
用于记录个人学习心得,算法小白一枚,还请各位大神多多指教~~~