剑指offer JZ-8
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例2
返回值
复制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]; } };
我们发现,状态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; } };