leetcode刷题之动态规划法NO.1
1.题目
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。
2.题目分析和解答
解法一:穷举法
穷举法是动态规划法的核心,只有找到了状态方程,才能进行下一步的优化。而找状态方程,三步走:一是明确基础情况,二是明确状态,三是明确状态转移。
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
解法二:带备忘录的自上而下解法
class Solution {
public:
int fib(int N) {
if (N == 0) {
return 0;
}
vector<int> mem(N+1, 0);
return helper(mem, N);
}
int helper(vector<int> &mem, int n)
{
if (n == 1 || n == 2) {
return 1;
}
if (mem[n] != 0) {
return mem[n];
}
mem[n] = helper(mem, n-1) + helper(mem, n-2);
return mem[n];
}
};
解法三:带备忘录的自下而上解法
class Solution {
public:
int fib(int N) {
if (N == 0) {
return 0;
}
return helper(N);
}
int helper(int n)
{
int front = 0;
int back = 0;
if (n == 1 || n == 2) {
return 1;
} else {
front = 1;
back = 1;
}
for (int i=3; i<n+1; i++) {
int tem = back;
back = front + back;
front = tem;
}
return back;
}
};
3.总结
3.1.code小技巧
- 在使用两个变量迭代的时候,可以考虑使用临时变量做为桥梁;
- 在使用循环的时候,考虑将循环变量的初始值与循环条件直接关联是个很好的做法,可以避免逻辑的混乱;
- 要想快速看懂代码,自己手动画图或者手动运行程序是个不错的选择
3.2.调试小技巧
- 当出现错误的时候,第一步应该是看错误提示,并从错误提示开始深入思考,第二步是自己陈述代码的运行逻辑,从中找原因。第三步是不要忽视任何一个细节,有可能是一个很愚蠢的错误导致的,但是被忽视了。
本文来自博客园,作者:曼路的个人博客,转载请注明原文链接:https://www.cnblogs.com/manlujun/p/15605402.html