简述
断断续续刷了一百多道leetcode简单题了,今天突然看见新增了一道斐波那契数列,十分经典,下面给出三种解法。
题目
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。
解题
【解法一递归
】
public int fib(int N) {
if(N < 2) return N;
return fib(N - 1) + fib(N - 2);
}
很容易理解,从第三项开始,每一项数字都是前面两项数字的和,这种方式效率不是很高,因为有大量的重复计算,如f(5)需要计算f(3)与f(4),f(6)又计算f(5),f(5)又计算f(4).... ,时间复杂度为O(2^n)
。
【解法二动态规划
】
public int fib(int N) {
//dp[N] = dp[N - 1] + dp[N - 2];
int[] dp = new int[N + 1];
if(N == 0) return 0;
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= N; i ++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[N];
}
dp方程为dp[N] = dp[N - 1] + dp[N - 2],用数组保存每个N对应的值,用的时候直接拿,不需要重复计算,时间复杂度为O(n)
。
【解法三遍历
】
public int fib(int N) {
if(N < 2) return N;
int a = 0;
int b = 1;
int c = 0;
for(int i = 2; i <= N; i ++){
c = a + b;
a = b;
b = c;
}
return c;
}
也很好理解,c = a + b,运算完成后,重新赋值,相当于右移一下,时间复杂度为O(n)
。
网友评论