剑指offer—青蛙跳台阶&变态跳台阶&矩形覆盖
博客中代码均在牛客C++11(clang++ 3.9)中通过
青蛙跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
我们可以这里的青蛙有两种选择,一种是跳1级台阶,另一种就是跳2级,我们可以从它最后一次的选择来分析,如果最后一次跳1级台阶,那就是n-1级台阶的跳法数,如果最后一次跳2级台阶,那就是n-2级台阶的跳法数,所以你级台阶的跳法数f(n)=f(n-1)+f(n-2),实际上就是斐波那契数列了
这里因为推导出这个式子,所以直接写出递归算法,如果要对时间复杂度优化可以参考上一篇博客:https://blog.youkuaiyun.com/kevin980123/article/details/86670292
代码如下:
class Solution {
public:
int jumpFloor(int number) {
if(number<3)
return number;
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这只青蛙就比较变态了,一次可以跳任意级台阶。我们这里暂且不讨论太的变态跳功,先对这种跳法作个分析:
一开始也许没有头绪,但是只要计算列出几次跳法你就会发现这其实是一道找规律的题:
n=1:1种
n=2:2种
n=3:4种
n=4:8种
……
总结出规律就是2^(n-1)
代码如下:
class Solution {
public:
int jumpFloorII(int number) {
return 1<<(number-1);
}
};
矩形覆盖:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
这道题实际上跟青蛙跳台阶一样,也是斐波那契数列
假设用n个21的小矩形无重叠地覆盖一个2n的大矩形,从左往右覆盖,当用第一个小矩形去覆盖时,有两种选择,横着放或者竖着放,如果竖着放,则还剩2*(n-1)的面积,方法有f(n-1)种;如果横着放,那么它的正下方也必须再横着放一个,所以只剩2*(n-2)的面积,方法有f(n-2)种,所以加起来就是f(n)=f(n-1)+f(n-2)种。
代码同上–>青蛙跳台阶