剑指offer JZ-9

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
示例1

输入

复制
3

返回值

复制
4

思路

JZ-8的简单变形,定义dp[k]为到达第k阶台阶的方案数

不难看出:dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1

后面的+1 实际上就是一次跳k阶这一种方案

动态规划代码如下

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

观察代码,我们 【dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1】这一部分的计算有重复

为了节约时间和空间,我们可以用一个变量sum来记录dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1

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