剑指offer JZ-8

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1

输入

复制
1

返回值

复制
1
示例2

输入

复制
4

返回值

复制
5

思路

动态规划入门问题,定义dp[k]为到达第k阶台阶的方案数,

由于上楼的方案有两种,所以k台阶可由第k-1台阶和k-2台阶直接到达

故,dp[k] = dp[k-1] + dp[k-2]

class Solution {
public:
    int jumpFloor(int number) {
        vector<int> dp;
        if(number == 1) return 1;
        if(number == 2) return 2;
        dp.push_back(0);
        dp.push_back(1);
        dp.push_back(2);
        for(int i=3;i<=number;i++)
        {
            int now = dp[i-1] + dp[i-2];
            dp.push_back(now);
        }
        return dp[number];
    }
};
View Code

我们发现,状态k只依赖于状态k-1和状态k-2,所以空间上可以优化

class Solution {
public:
    int jumpFloor(int number) {
        int pre_1 = 2;
        int pre_2 = 1;
        int now = 0;
        if(number == 1) return 1;
        if(number == 2) return 2;
        for(int i=3;i<=number;i++)
        {
            now = pre_1 + pre_2;
            pre_2 = pre_1;
            pre_1 = now;
        }
        return now;
    }
};
View Code
原文地址:https://www.cnblogs.com/alan-W/p/14227383.html