跳台阶解析【剑指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天有多少牛的问题,实质上就是一个线性迭代问题,这类问题就是稍微变化了一下斐波那契数列,都可以用矩阵的方法。不过具体问题还是要具体分析,就像后面一个问题能找出数学解这么神奇的事情~
- 跳台阶解析【剑指Offer】
- 剑指offer-跳台阶
- 【剑指offer】跳台阶
- 剑指offer--跳台阶
- 《剑指offer》跳台阶
- 剑指Offer-跳台阶
- 《剑指offer》跳台阶
- 剑指 offer:跳台阶
- 【剑指Offer】跳台阶
- 剑指offer 跳台阶
- 剑指offer--跳台阶
- 剑指offer 跳台阶
- 《剑指offer》跳台阶
- 剑指offer-跳台阶
- 剑指offer----跳台阶
- 剑指Offer:跳台阶
- 《剑指Offer》 跳台阶
- 剑指offer--跳台阶
- mybatis动态SQL语句
- Mybatis 中 if test字符串比较问题
- android 比较靠谱的图片压缩
- NGUI的代码控制
- uva11992区间修改线段树
- 跳台阶解析【剑指Offer】
- 操作队列
- LeetCode Reverse Linked List
- XPath入门教程
- 使用wget 命令下载JDK的方法
- shell脚本中一些特殊符号
- Leetcode_Palindrome Partitioning II
- Atom编辑器折腾记_(14)JQ代码片段补全(插件:Jquery-snippets)
- 在交互式shell脚本中创建对话框