跳台阶解析【剑指Offer】

来源:互联网 发布:剑灵捏脸数据fate 编辑:程序博客网 时间:2024/05/22 06:17

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。(题目链接:跳台阶

解析,初学者可能会想到用递归的方法,f(n) = f(n - 1) + f(n - 2),这样写的缺点显而易见,复杂度过高,是指数级别,是复杂度是所以聪明一点的程序设计者会使用动态规划的方法,保存中间临时变量,这样时间复杂度就降成了O(N),空间复杂度也变成了O(1)

好奇的人可能不会满足现在的解,继续探索更好的解。线性代数是专门解决线性问题的,这里的线性迭代过程可以用矩阵乘法进行优化,请看下面的乘法:


这个式子有什么好处呢,可以发现每一次迭代只是当前项矩阵与一个常数矩阵的乘法,然后求第N项就是求一个初始举证乘以一个常数举证的N次方的结果,求矩阵幂可以有快速幂的方法,复杂度是O(logN),这样我们就把复杂度降到了log量级了。


如果是还有读者对这个结果还不满意,还想进一步进行求解。那么他一定在想O(1)的解法,这样的解法会有吗?稍微看一下就知道这是一个斐波那契数列,上网搜一下,立马能找到斐波那契的通项公式,有了公式理论上是可以到O(1)的,不过这个通项有幂运算,计算复杂度依然不会小于log量级,除非事先打表。


接下来,有一个升级版的青蛙跳台阶问题,就是青蛙跳台阶的级数由1-2上升到1-n,同样是问青蛙跳到n级台阶的方案有多少种。

虽然是跳的台阶数增加了,之前的方法还是可行的,用DP的方法时间复杂变成了O(n ^ 2),用矩阵的方法的复杂度变成了O(nlogn),似乎都不太够理想,有没有比较优美一点的答案呢?推导一下:

f(n) = f(n – 1) + f(n – 2) + …. f(0),那么f(n – 1) = f(n – 2) + …. f(0)

可以看出f(n) = 2 * f(n – 1),惊讶了!变成了一个等比数列,结果变成了一个纯数学解。。。


有不少类似的题目,比如说大牛隔3年能生小牛问第N天有多少牛的问题,实质上就是一个线性迭代问题,这类问题就是稍微变化了一下斐波那契数列,都可以用矩阵的方法。不过具体问题还是要具体分析,就像后面一个问题能找出数学解这么神奇的事情~

0 0
原创粉丝点击