7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列
题目:斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
f(n) = f(n-1) + f(n-2)
基本思路
这道题在剑指offer中实际是当作递归的反例来说的。
递归的本质是吧一个问题分解成两个或者多个小问题,如果多个小问题存在互相重叠的情况,那么就存在重复计算。
f(n) = f(n-1) + f(n-2) 这种拆分使用递归是典型的存在重叠的情况,所以会造成非常多的重复计算。
另外,每一次函数调用爱内存中都需要分配空间,每个进程的栈的容量是有限的,递归层次过多,就会造成栈溢出。
递归是从最大数开始,不断拆解成小的数计算,如果不去考虑递归,我们只需要从小数开始算起,从底层不断往上累加就可以了,其实思路也很简单。
代码
function Fibonacci(n)
{
if(n<=1){
return n;
}
let i = 1;
let pre = 0;
let current = 1;
let result = 0;
while(i++ < n){
result = pre + current;
pre = current;
current = result;
}
return result;
}
题目:跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
基本思路
找规律:
跳三级台阶等于跳两级台阶的跳法+跳一级台阶的跳法。
跳四级台阶等于跳三级台阶的跳法+跳二级台阶的跳法。
明显也符合斐波那契数列的规律
f(n) = f(n-1) + f(n-2)
代码
function jumpFloor(n)
{
if(n<=2){
return n;
}
let i = 2;
let pre = 1;
let current = 2;
let result = 0;
while(i++ < n){
result = pre + current;
pre = current;
current = result;
}
return result;
}
题目:变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
f(n) = f(n-1) + f(n-2)
基本思路
每个台阶都可以选择跳或者不跳,最后一个台阶必跳。
每个台阶有两种选择,n个台阶有2的n次方种选择。
所以一共有2的n-1次跳法。
使用位运算
代码
function jumpFloorII(number)
{
return 1<<(--number);//Math.power(2,number-1)
}
题目:矩形覆盖
基本思路
假设为2*8,f(8)用第一个小矩形去覆盖左边有两种,竖着的之后,右边有f(7)中选择,当横着的时候,有f(6)中选择,所以f(8)=f(7)+f(6),也是斐波那契数列,n=1时只有一种,n=2时有两种,f(n)=f(n-1)+f(n-2)
代码
function rectCover(number)
{
// write code here
if(number<0)
return ;
if(number<=2)
return number;
let [one,two]=[1,2];
let temp;
for(var i=3;i<=number;i++)
{
temp=one;
one=two;
two=temp+two;
}
return two;
}
7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列的更多相关文章
- 剑指offer编程题Java实现——面试题9斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项. package Solution; /** * 剑指offer面试题9:斐波那契数列 * 题目:写一个函数,输入n,求斐波那契数列的第n项. * 0 ...
- 斐波那契数列的5种python实现写法
斐波那契数列的5种python写法 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖 ...
- 用Python来实现斐波那契数列.
1).递归 def fib_recur(n): assert n >= 0, "n > 0" if n <= 1: return n return fib_rec ...
- 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)
递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...
- C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...
- 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...
- (1)剑指Offer之斐波那契数列问题和跳台阶问题
一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...
- 斐波那契数列,跳台阶(dp思想)
一 . 斐波那契数列:1,1,2,3,5,8,13,21 即后一项是前两项的和. class Solution { private: ]; public: Solution() { memset(ar ...
- [剑指offer]10.斐波那契数列+青蛙跳台阶问题
10- I. 斐波那契数列 方法一 Top-down 用递归实现 def fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...
随机推荐
- js跳转方式 【转】
第一种: <script language="javascript" type="text/javascript"> wi ...
- bootstrap table 根据单元格中的数据改变单元格的样式
在bootstrap-table.js里面列属性 formatter就是用来格式化单元格的,其默认值是undefined 类型是function,function(value, row, index ...
- OpenResty创造者
OpenResty 是一个开源的 Web 平台,用于开发高性能和高动态的 Web 网关或者 Web 应用.OpenResty 最早是为了支持全网搜索引擎周边的相关搜索的 API 接口,后来我们基于 N ...
- Oracle数据库当前连接数、最大连接数的查询与设置
在开发过程中Oracle数据库有时候连得上,有时候又连不上,提示如下异常“ORA-12519: TNS:no appropriate service handler found 解决”,可能是数据库上 ...
- ceph与openstack对接(cinder、glance、nova)
对接分为三种,也就是存储为openstack提供的三类功能1.云盘,就好比我们新加的硬盘2.原本的镜像也放在ceph里,但是我没有选择这种方式,原因是因为后期有要求,但是我会把这个也写出来,大家自己对 ...
- HDU5971【瞎搞】
题意:略(忙着准备文化课...明天期中考啊.... 思路: 正解就是染色,2-sat搞: AC代码(虽然是错误的...数据水(过踏马的也行啊,起码打脸他啊!) 4 3 1 0 1 2 2 3 3 4 ...
- 【Unity3D】3D角色换装++ Advance
http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...
- 简单实现TabBar的自定义
StackoverFlow上看到的,通过继承UITabBarController创建自定义TabBarController.在原有TabBar的基础上添加一个背景层,在其基础上增加三个自定义按钮,通过 ...
- TensorFlow数据集(一)——数据集的基本使用方法
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 例子:从一个张量创建一个数据集,遍历这个数据集,并对每个输入输出y = x^2 的值. #!/usr/bin/en ...
- linux ping
ping [ -d] [ -D ] [ -n ] [ -q ] [ -r] [ -v] [ -R ] [ -a addr_family ] [ -c Count ] [ -w timeout ...