跳台阶问题
来源:互联网 发布:aix 多路径软件 编辑:程序博客网 时间:2024/05/13 05:08
跳台阶问题
题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。
求总共有多少总跳法,并分析算法的时间复杂度。
分析:在九月腾讯,创新工场,淘宝等公司最新面试十三题中第23题又出现了这个问题,题目描述如下:23、人人笔试1:一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法?咱们先撇开这个人人笔试的问题(其实差别就在于人人笔试题中多了一次可以跳三级的情况而已),先来看这个第27题。
首先考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。
现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。
我们把上面的分析用一个公式总结如下:
/ 1 n=1
f(n)= 2 n=2
\ f(n-1) + f(n-2) n>2
原来上述问题就是我们平常所熟知的Fibonacci数列问题。可编写代码,如下:
<div bg_cpp"="" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; border: 1px dashed rgb(153, 153, 153); background-color: rgb(245, 245, 245); width: 687.0499877929688px; color: rgb(51, 51, 51); line-height: 26px;">- long long Fibonacci_Solution1(unsigned int n)
- {
- int result[2] = {0, 1};
- if(n < 2)
- return result[n];
- return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
- }
那么,如果是人人笔试那道题呢?一个人上台阶可以一次上1个,2个,或者3个,岂不是可以轻而易举的写下如下公式:
/ 1 n=1
f(n)= 2 n=2
4 n=3 //111, 12, 21, 3
\ f(n-1)+(f-2)+f(n-3) n>3
行文至此,你可能会认为问题已经解决了,但事实上没有:
- 用递归方法计算的时间复杂度是以n的指数的方式递增的,我们可以尝试用递推方法解决。具体如何操作,读者自行思考。
- 有一种方法,能在O(logn)的时间复杂度内求解Fibonacci数列问题,你能想到么?
int fib(int n){ int f[3] = {1,2,4}; if(n < 3) return f[n-1]; for(int i = 3;i < n;i++) { int tmp = f[0]+f[1]+f[2]; f[0] = f[1]; f[1] = f[2]; f[2] = tmp; } return f[2];}
- 跳台阶问题(变态跳台阶)
- 跳台阶问题(变态跳台阶)
- 跳台阶与变态跳台阶问题
- 青蛙跳台阶,变态跳台阶问题
- 跳台阶问题(变态跳台阶)
- 跳台阶问题(变态跳台阶)
- 跳台阶以及变态跳台阶问题
- 青蛙跳台阶/变态跳台阶问题
- 跳台阶问题--总结
- 27.跳台阶问题
- 青蛙跳台阶问题
- 27、跳台阶问题
- 跳台阶问题
- 跳台阶问题
- 27.跳台阶问题
- 跳台阶问题
- 跳台阶问题
- 跳台阶问题
- Can't create handler inside thread that has not called Looper.prepare() 错误
- jQuery选择器探讨进阶
- unity 调用android函数
- IOS常见bug.001—'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in
- [Icpc] zoj 1037 Gridland (water C++ / Java)
- 跳台阶问题
- Object-C 学习笔记(二十一)---延展Extendtion
- Java基础10--多态--内部类
- qualcomm 的android 编译
- AD域信息修改
- OpenStack 里虚机不能ping通controller的原因。
- WebUI组件的设计目标:不是功能齐全,而是结构合理易于扩展、体积小巧
- gdb使用
- netperf 与网络性能测量