跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
假设我们现在在第n阶阶梯上,显然,我们上一步是在n-1阶或者n-2阶,我们可以知道,第n阶的方法=n-1阶的方法+n-2阶的方法
同样的,对于n-1阶和n-2阶我们也可以用类似的方法进行求解。
而当我们求到0阶和1阶的时候,显然方法种数分别为1、1。
所以如果f[i]表示爬到第i阶的方法数,那么
f[0]=1 f[1] = 1;
f[i] = f[i - 1]+ f[i - 2] ;
class Solution {
public:
int jumpFloor(int number) {
int ret=0;
if(number==0||number==1)
ret=1;
else
{
int prev=1;
int pprev=1;
while(number>1)
{
ret=prev+pprev;
pprev=prev;
prev=ret;
number--;
}
}
return ret;
//if(number==0||number==1)
// return 1;
// return jumpFloor(number-1)+jumpFloor(number-2);
}
};
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
由题意知:跳n阶台阶:一步可以跳1级,跳2级,跳3级直至跳n级。
如果一步跳1级:剩下n-1级,则剩下跳法是f(n-1)种;
如果一步跳2级:剩下n-2级,则剩下跳法是f(n-2)种;
f(n)=f(n-1)+f(n-2)+f(n-3)+…f(1)+f(0);
f(n-1)=f(n-2)+f(n-3)+f(n-4)+…+f(1)+f(0);
那么f(n)=2*f(n-1);
用递归代码如下:
int jumpFloor1(int n)
{
int result = 0;
if (n == 0 || n == 1)
{
return 1 ;
}
int num = n;
while (num--)
{
result = result+ jumpFloor1(n - 1);
n--;
}
return result;
}
用递推代码如下:
int jumpFloor2(int n)
{
int ret = 1;
if (n == 0 || n == 1)
return ret;
for (int i = 2; i <= n; i++)
{
ret = ret * 2;
}
return ret;
}
第0阶台阶有一种跳法,第1阶台阶有一种跳法,第2阶台阶有2 (21)种跳法,第3阶台阶有4(22)种跳法,第4阶台阶有8(23)种跳法…那么可以退出f(n)=2(n-1)种跳法,即f(n)=pow(2,n-1),代码如下:
int jumpFloorII(int number) {
if(number==0||number==1)
{
return 1;
}
return (int)pow(2,number-1);