文章目录
思路
解题方法
复杂度
时间复杂度:
空间复杂度:
Code
解法一 (暴力搜索)
class Solution {
public int fib(int n) {
if(n == 0) {
return 0;
}
if(n == 1) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
}
解法二 (记忆化搜索)
class Solution {
public int fib(int n) {
int[] arr = new int[n + 1];
Arrays.fill(arr, -1);
return f(n, arr);
}
public int f(int n, int[] arr) {
if(n == 0) {
return 0;
}
if(n == 1) {
return 1;
}
// 命中缓存
if(arr[n] != -1) {
return arr[n];
}
int ans = f(n - 1, arr) + f(n - 2, arr);
// 记录缓存
arr[n] = ans;
return ans;
}
}
解法三(动态规划)
class Solution {
public int fib(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
解法四(动态规划(空间O(1)))
class Solution {
public int fib(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int Lastlast = 0, Last = 1;
for (int i = 2, cur; i <= n; i++) {
cur = Lastlast + Last;
Lastlast = Last;
Last = cur;
}
return Last;
}
}