NC68.跳台阶

class Solution {
public:
    int jumpFloor(int number) {
        // f(1) = 1
        // f(2) = 2
        // f(n) = f(n - 1) + f(n - 2)
        int ans = -1;
        if (number >= 1 && number <= 40) {
            if (number == 1) {
                ans = 1;
            }
            if (number == 2) {
                ans = 2;
            }
            int front = 2, after = 1;
            int tmp;
            for (int i = 3; i <= number; ++i) {
                ans = front + after;
                tmp = front;
                front = ans;
                after = tmp;
            }
        }
        return ans;
    }
};

解题思路:

难点1:重点中的重点,就看能不能总结出递推公式了。第一反应想着能不能通过数学方法得到直接公式,在O(1)的时空复杂度内完成题解,在这上面浪费了时间;

// f(1) = 1
// f(2) = 2
// f(n) = f(n - 1) + f(n - 2)

难点2:即使是总结出递推公式,题目对时空复杂度有着严格的限制,没办法直接用递归去做,最终还是得要靠动态规划并压缩动态空间去解决;

难点3:总结公式的时候,个人认为没有必要去看f(0)的情况,不太好理解,直接看f(1)和f(2)即可;

难点4:用了一个ans变量,代码多了几行,但没有官方给出的答案那么绕,便于理解;

最后,真的很烦动态规划!!!