题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
以下为 2019.06.06 更新
class Solution {
public:
int jumpFloor(int number) {
/**
* 首先明确青蛙的能力,他可以跳1级,可以跳两级
* 好,接下来,我们来看看,青蛙怎么跳上5级台阶
* 对5级台阶,它可以从4级台阶跳1步上来,
* 也可以从3级台阶跳2步上来,我们不妨记为 f(5) = f(4) + f(3)
* 对4级台阶,它可以从3级跳1步上来。也可以从2级跳1步上来 不妨记为 f(4) = f(3) + f(2)
* 对3级台阶,它可以从2级台阶跳一步上来,也可以从1级台阶跳两步上来,f(3) = f(2) + f(1)
* 对两级台阶,可以从1级跳1步上来,也可以直接调到2级,f(2) = 2;
* f(1) = 1
* 很完美的斐波那契数列
*/
if (number <= 0)
{
return 0;
}
if(number == 1)
{
return 1;
}
if(number == 2)
{
return 2;
}
int f1 = 1;
int f2 = 2;
int f3 = 0;
for(int i = 3; i <= number; ++i)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
};
以上为 2019.06.06 更新
题解
台阶不应该为负数,但这是题目,万一有个负数测试用例呢,所以我们避免一下
如果台阶只有一级,那肯定只有一种方法
如果台阶有两级,就有两种办法,一次跳一步,和一步跳两级
如果有三级台阶,一次一步一步的跳可以,跳一步,再跳两步可以,跳两步再跳一步可以,只有这三种办法
我们再来分析一波,
假设现在6个台阶,
我们可以从第5跳一步到6,
这样的话有多少种方案跳到5就有多少种方案跳到6,
另外我们也可以从4跳两步跳到6,
跳到4有多少种方案的话,就有多少种方案跳到6
代码附上:
代码已上传 github,可用 git 工具下载查看:
github 代码链接,欢迎点击查看
/*
*一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法
(先后次序不同算不同的结果)。
* */
class Solution {
public:
int jumpFloor(int number) {
// 台阶数肯定不为负,就不考虑负数情况了
// 如果只有一个台阶 只有跳一步一种方法
// 如果有两个台阶,可以跳两次一步,也可以一次跳两步
// 就有两种方法
// 这两种情况很简单
// 我们先对这两种情况处理
int res[3] = {0, 1, 2};
if(number < 3)
{
return res[number];
}
// 接下来我们考虑多个台阶的情况
/*假设现在6个台阶,
* 我们可以从第5跳一步到6,
* 这样的话有多少种方案跳到5就有多少种方案跳到6,
* 另外我们也可以从4跳两步跳到6,
* 跳到4有多少种方案的话,就有多少种方案跳到6*/
// 这就是一种转化的思想
int first = 1;
int second = 2;
int third = 0;
for(int i = 3; i <= number; ++i)
{
third = first + second;
first = second;
second = third;
}
return third;
}
};
接下来我们看一道同类型的题,也是跳台阶:
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
以上为 2019.06.06 更新
class Solution {
public:
int jumpFloorII(int number) {
if(number <= 0)
{
return 0;
}
// 对一个n级台阶来说
// 第一步有 n 种跳法
// 跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1)
// 跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
// 所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + ...+ jumpFloorII(1)
// 又有 jumpFloorII(n-1) = jumpFloorII(n-2) + ...+ jumpFloorII(1)
// 所以 jumpFloorII(n) = 2 * f(n-1);
// 若 n=1 jumpFloorII(1) = 1;
// 若 n=2 jumpFloorII(2) = 2*jumpFloorII(1) = 2;
// 若 n=3 jumpFloorII(3) = 2*jumpFloorII(2) = 4;
//
// 若 n=n jumpFloorII(n) = 2^(n-1);
int steps = 1;
for(int i = 1; i < number; ++i)
{
steps *= 2;
}
return steps;
}
};
以上为 2016.06.06 更新
题解
乍一看这题和上一题一样,好像复杂了一点点,上一道题每次只能跳一步或者跳两步,二这道题,一次可以跳n步,那我们来缕缕:
对一个n级台阶来说
第一步有 n 种跳法
跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1)
跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + …+ jumpFloorII(1)
又有 jumpFloorII(n-1) = jumpFloorII(n-2) + …+ jumpFloorII(1)
所以 jumpFloorII(n) = 2 * f(n-1);
若 n=1 jumpFloorII(1) = 1;
若 n=2 jumpFloorII(2) = 2 * jumpFloorII(1) = 2;
若 n=3 jumpFloorII(3) = 2 * jumpFloorII(2) = 4;
若 n=n jumpFloorII(n) = 2^(n-1);
缕完了之后我们发现题目貌似简单了
接下来代码附上;
同样有 github 链接哟,欢迎查看:
gitbub 代码链接,欢迎点击查看
class Solution {
public:
int jumpFloorII(int number) {
if(number <= 0)
{
return 0;
}
// 对一个n级台阶来说
// 第一步有 n 种跳法
// 跳一级,剩下 n-1 步的跳法为jumpFloorII(n-1)
// 跳两级,剩下 n-2 步的跳法为jumpFloorII(n-2)
// 所以 jumpFloorII(n) = jumpFloorII(n-1)+jumpFloorII(n-2) + ...+ jumpFloorII(1)
// 又有 jumpFloorII(n-1) = jumpFloorII(n-2) + ...+ jumpFloorII(1)
// 所以 jumpFloorII(n) = 2 * f(n-1);
// 若 n=1 jumpFloorII(1) = 1;
// 若 n=2 jumpFloorII(2) = 2*jumpFloorII(1) = 2;
// 若 n=3 jumpFloorII(3) = 2*jumpFloorII(2) = 4;
//
// 若 n=n jumpFloorII(n) = 2^(n-1);
int steps = 1;
for(int i = 1; i < number; ++i)
{
steps *= 2;
}
return steps;
}
};
有什么问题欢迎留言,有更好的解法还请不吝赐教,好好学习,共同进步 ?