(原)剑指offer跳台阶和矩形覆盖

时间:2024-11-13 13:07:08
跳台阶
  • 时间限制:1秒空间限制:32768K

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析同样为斐波那契数列边形这样的题肯定有公式
设n级台阶,总跳法 jumps
n      jumps
1       1
2       2
3       3
4       5
5       8
猜测 fbonicc(n) = fbonicc(n-1) + fbonicc(n-2)
3        4          5
111      1111        1111(1)
21        211          211(1)
12        121         121(1)
        112         112(1)
        22          22(1)
                   111(2)
                   21(2)
                   12(2)
现在我们可以这样理解当   f(n) 比 f(n-1)少一个台阶
这一个台阶我们可以当一步跳完,也可以与前面的一步结合成一次跳两阶,So
前一种情况我们可以直接把这一步添到f(n-1)所有跳数后面,后一种情况很显然我们要向f(n - 1)借一步,也就是f(n-2)
所以得f(n) = f(n-1) + f(n-2)
c++代码实现
class Solution {
public:
int jumpFloor(int number) {
long long fiboncciA = 1;
long long fiboncciB = 2;
if (number == 1){
return fiboncciA;
}
if (number == 2) {
return fiboncciB;
} int i;
for (i = 3; i <= number; i++){
int tmp = fiboncciB;
fiboncciB = fiboncciA + fiboncciB;
fiboncciA = tmp;
}
return fiboncciB;
}
};

下一题

  • 时间限制:1秒空间限制:32768K
  • 题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
!!猛一看这道题有点没看懂
先来仔细分析一下
1:所有小矩形都竖着覆盖
2:当矩形横着覆盖时都是成对出现的
看到这里有感觉很熟悉,这不就是跳台阶问题吗?答案:是的
我们可以把题目改一下:有n个小矩形,去覆盖大矩形你可以一次用一个,也可以一次用两个,总共有多少种覆盖方法。
现在可以看懂了吧!
c++代码实现
代码同上