跳台阶解析【剑指Offer】
2015-08-22 03:56
218 查看
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。(题目链接:跳台阶)
解析,初学者可能会想到用递归的方法,f(n)
= f(n - 1) + f(n - 2),这样写的缺点显而易见,复杂度过高,是指数级别,是复杂度是所以聪明一点的程序设计者会使用动态规划的方法,保存中间临时变量,这样时间复杂度就降成了O(N),空间复杂度也变成了O(1)。
好奇的人可能不会满足现在的解,继续探索更好的解。线性代数是专门解决线性问题的,这里的线性迭代过程可以用矩阵乘法进行优化,请看下面的乘法:
![](http://img.blog.csdn.net/20150822040020228?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个式子有什么好处呢,可以发现每一次迭代只是当前项矩阵与一个常数矩阵的乘法,然后求第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天有多少牛的问题,实质上就是一个线性迭代问题,这类问题就是稍微变化了一下斐波那契数列,都可以用矩阵的方法。不过具体问题还是要具体分析,就像后面一个问题能找出数学解这么神奇的事情~
解析,初学者可能会想到用递归的方法,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天有多少牛的问题,实质上就是一个线性迭代问题,这类问题就是稍微变化了一下斐波那契数列,都可以用矩阵的方法。不过具体问题还是要具体分析,就像后面一个问题能找出数学解这么神奇的事情~
相关文章推荐
- node + Express 服务器性能实验
- HTML5 web workes实现多线程
- 高级JS内容——JavaScript高级程序设计笔记
- AJAX——JavaScript高级程序设计笔记(16)
- AngularJs学习经验汇集
- AngularJs学习经验汇集
- 终于解决:在客户端和服务端都用dojo Loader来实现异步加载后,Node.js的全局变量__dirname无法使用
- 《剑指offer》之从上往下打印二叉树
- DocFetcher CMD 启动脚本
- JQuery实现回车代替Tab键(按回车跳到下一栏)
- jQuery插件开发精品教程
- 修改LibreOffice Draw中定义的样式名称
- table表格css样式
- JQuery选择器操作
- jquery的children方法和css3选择器配合使用
- String 和 StringBuffer区别
- CSS优先级
- jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
- jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
- jquery实现很酷的网页顶部图标下拉菜单效果