变态跳台阶问题的解题思路
简介:本文主要记录了 变态跳台阶问题 的推导过程
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
问题转换
这个问题我们可以转换思路,将其转换成求树的节点0的个数的题目。
假设存在一棵树,它的根节点是N,它的子节点从左往右依次为 n-1, n-2, … 直到0。
同理,根节点子节点的子节点也遵循这样的规律,0节点没有子节点。请问在这棵树中,0节点一共有多少个?
根节点为3的树如下图所示:
从 0 到 3 的路径可以认为是青蛙跳到三阶台阶上的路径,0 的个数就是跳法的个数
答案推导
如上所示,我们已经将问题转换成了求树中0节点的个数,根据树的递归定义,我们可以得到如下的定义:
- \(f(1) = 1\)
- \(f(n) = f(n-1) + f(n-2) + … + f(1) + 1\)
- \(f(n-1) = \space \space \space \space \space \space \space \space \space \space \space \space f(n-2) + … + f(1) + 1\)
令\(f(n) - f(n-1)\),可得:\(f(n) = 2 * f(n-1)\)。
根据\(f(1) = 1\)和\(f(n) = 2 * f(n-1)\),我们最终可以得到,\(f(n) = 2^{n-1}\)。
最终答案
有了上面的推导过程,最终的编程实现很简单,我们只需要返回\(2^{n-1}\)即可,答案如下:
#include <cmath>
class Solution {
public:
int jumpFloorII(int number) {
return pow(2, number - 1);
}
};
2018年07月08日 / 14:46