LeetCode 509、斐波那契数列
题目
题解
按照动态规划五步走:
-
确定 dp数组 以及下标的含义:
dp[i] 表示第 i 个斐波那契数的值
-
确定递推公式:
题目中已给出:dp[i] = dp[i - 2] + dp[i - 1]
-
dp数组 如何初始化:
dp[0] = 0;
dp[1] = 1;
-
确定遍历顺序:
dp[i] 依赖于 dp[i - 1] 和 dp[i -2],因此遍历顺序从前到后
-
举例推导dp数组
按照上面的递推公式,当N为10时,dp数组为:0 1 1 2 3 5 8 13 21 34 55
class Solution {
public:
int fib(int n) {
if (n <= 1) return n;
vector<int> dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 2] + dp[i - 1];
}
return dp[n];
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
优化一下,只需维护两个数值,不需要记录整个序列:
class Solution {
public:
int fib(int n) {
if (n <= 1) return n;
int dp[3] = {0, 1};
for (int i = 2; i <= n; i++) {
dp[2] = dp[0] + dp[1];
dp[0] = dp[1];
dp[1] = dp[2];
}
return dp[2];
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)