//一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
//递归
class Solution1 {
public:
int jumpFloor(int number)
{
if (number<=1)
return 1;
return jumpFloor(number-1) + jumpFloor(number-2);
}
};
/*
f(n-1) + f(n-2) n>=2
f(n) =
1 n=1,0
*/
class Solution {
public:
int jumpFloor(int number)
{
if (number<=1)
return 1;
int tmp1 = 0,tmp2 = 0;
map<int, int> ::iterator iter1 = mmap.find(number-1);
map<int, int> ::iterator iter2 = mmap.find(number-2);
if (iter1 == mmap.end())
{
tmp1 =jumpFloor(number-1);
mmap[number - 1] = tmp1;
}
else
{
tmp1 = mmap[number - 1];
}
if (iter2 == mmap.end())
{
tmp2 =jumpFloor(number-2);
mmap[number - 2] = tmp2;
}
else
{
tmp2 = mmap[number - 2];
}
return tmp1 + tmp2;
}
map<int,int> mmap;
};
class Solution2 {
public:
int jumpFloor(int number)
{
vector<int> vec(number+1, 0);
vec[0] = 1;
vec[1] = 1;
for(int i=2; i<=number; i++)
{
vec[i] = vec[i-1] + vec[i-2];
}
return vec[number];
}
};
//一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
//递归
class Solution {
public:
int jumpFloorII(int number)
{
int ret = 0;
for (int i=1; i<number; i++)
{
ret += jumpFloorII(number-i);
}
return ++ret;
}
};
/*
f(n-1) + f(n-2) + ....+f(1) +1 n>=2
f(n) =
1 n=1
*/
class Solution {
public:
int jumpFloorII(int number)
{
int ret = 0;
for (int i=1; i<number; i++)
{
int tmp1 , tmp2;
map<int, int> ::iterator iter1 = mmap.find(number-i);
if (mmap.end() == iter1)
{
tmp1 = jumpFloorII(number-i);
mmap[number-i] = tmp1;
}
else
{
tmp1 = mmap[number-i];
}
ret += tmp1;
}
return ++ret;
}
map<int,int> mmap;
};
class Solution {
public:
int jumpFloorII(int number)
{
vector<int> vec(number+1, 0);
vec[1] = 1;
for(int i=2; i<=number; i++)
{
vec[i] = accumulate(vec.begin(), vec.begin()+i, 0) + 1;
}
return vec[number];
}
};
//将结果直接推导出
/*
2^(n-1) n>=1
f(n) =
0 ` n=0
*/
cla
class Solution {
public:
int jumpFloorII(int number)
{
if (0 == number)
return 0;
else
return 1<<(number-1);
}
};