一. 题目
-
题目
-
示例
二. 方法一: 递归
-
解题思路
-
解题代码
def fib(self, N: int) -> int: if N == 0: return 0 elif N == 1: return 1 else: return self.fib(N - 1) + self.fib(N - 2)
-
分析
时间复杂度: O(2^n)
空间复杂度: O(n)
三. 方法二: 动态规划
-
解题思路
-
解题代码1: python
def fib(self, N: int) -> int: result = [_ for _ in range(N + 1)] #if N >= 2: for index in range(2, N + 1): result[index] = result[index - 1] + result[index - 2] return result[N]
-
解题代码2: java
class Solution { public int fib(int n) { // 因为n大于等于0, 所以这里就没有考虑为负数的情况 if(n == 0 || n == 1){ return n; } // 到这一步, 说明n的值大于等于2 int[] res = new int[n + 1]; res[0] = 0; res[1] = 1; for(int i = 2; i <= n; i++) { res[i] = res[i - 1] + res[i - 2]; } return res[n]; } }
-
分析
时间复杂度: O(n)
空间复杂度: O(n)
四. 方法三: 递归
-
解题思路
用列表存储已经算过的结果, 第二次调用时直接使用列表中的值 -
解题代码
class Solution { public int fib(int n) { if(n == 0){ return 0; } // 创建长度为n + 1的列表, 并且赋值为0 int[] res = new int[n + 1]; return solve(n, res); } public int solve(int n, int[] res){ if(n == 1 || n == 2) { return 1; } // 如果列表中已经存在, 则直接返回结果 if(res[n] != 0) { return res[n]; } // 如果列表中不存在, 则将结果存入列表 res[n] = solve(n - 1, res) + solve(n - 2, res); return res[n]; } }