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.调试小技巧

  • 当出现错误的时候,第一步应该是看错误提示,并从错误提示开始深入思考,第二步是自己陈述代码的运行逻辑,从中找原因。第三步是不要忽视任何一个细节,有可能是一个很愚蠢的错误导致的,但是被忽视了。
posted @ 2021-11-25 22:37  曼路的个人博客  阅读(46)  评论(0编辑  收藏  举报