概述
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思考:在台阶数少的时候,可以手动计算一下跳台阶的跳法。
台阶数 = 1时,
1 总共1种
台阶数 = 2时,
1 + 1, 2 总共2种
台阶数 = 3时,
1 + 1 + 1, 1 + 2, 2 + 1, 3 总共4种
台阶数 = 4时,
1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 2 + 2, 3 + 1, 1 + 3, 4 总共8种
另台阶数为1时的跳法为f(1), 台阶数为2时的跳法为f(2), 台阶数为3时的跳法为f(3),以此类推,台阶数为n时的跳法为f(n)。
f(1) = 1; f(2) = 2; f(3) = 4; f(4) = 8...
可以找到以下规律,
f(1) = 1
f(2) = f(1) + 1 = 1 + 1 = 2
f(3) = f(2) + f(1) + 1 = 2 + 1 + 1 = 4
f(4) = f(3) + f(2) + f(1) + 1 = 4 + 2 + 1 + 1 =8
可以另f(0) = 1, 能够发现以下规律
f(1) = f(0)
f(2) = f(1) + f(0) = 1 + 1 = 2
f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4
f(4) = f(3) + f(2) + f(1) + f(0) = 4 + 2 + 1 + 1 =8
以此类推,可以得出
f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)
编程书写情况和运行结果如下所示,
class Solution {
public:
int jumpFloorII(int number) {
vector<int> f(number + 1);
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= number; i++) {
f[i] = 0;
for(int j = 0; j < i; j++) {
f[i] += f[j];
}
}
return f[number];
}
};
以上代码测试结果,运行时间:2ms 占用内存:480K
当然,此题还有更优解法
例如,把f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)继续优化
f(n - 1) = f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)
f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)
当n = 1,f(1) = 1;
当n > 1, f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)
编程书写情况和运行结果如下所示,
class Solution {
public:
int jumpFloorII(int number) {
if(number == 1) {
return 1;
}
else {
return 2 * jumpFloorII(number - 1);
}
}
};
以上代码测试结果,运行时间:4ms 占用内存:476K
最后
以上就是端庄流沙为你收集整理的笔试题——变态跳台阶的全部内容,希望文章能够帮你解决笔试题——变态跳台阶所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复