斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
来源:互联网 发布:建筑三维软件 编辑:程序博客网 时间:2024/04/28 23:52
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
class Solution {public: int Fibonacci(int n) { int preNum = 1; int prePreNum = 0; int result = 0; if(n<=1) return n; for(int i = 1; i < n; i++){ result = preNum + prePreNum; prePreNum = preNum; preNum = result; } return result; }};
此题最好用循环,不要用递归。
如果测试用例里有一个很大的n,则可能会发生溢出。
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
本题比较倾向于找规律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律,典型的斐波那契数列,但是为什么会出现这样的规律呢?假设现在6个台阶,我们可以从第5跳一步到6,这样的话有多少种方案跳到5就有多少种方案跳到6,另外我们也可以从4跳两步跳到6,跳到4有多少种方案的话,就有多少种方案跳到6,其他的不能从3跳到6了,所以最后就是f(6) = f(5) + f(4);这样子也很好理解跳台阶的问题了。
class Solution {public: int jumpFloor(int number) { if (number == 0 || number == 1 || number == 2) return number; int jumpSum = 0; int jumpTwo = 1; //往前算两个台阶的跳法 int jumpOne = 2;//往前算一个台阶的跳法 for(int i = 3; i<=number; i++){ jumpSum = jumpOne + jumpTwo; jumpTwo = jumpOne; jumpOne = jumpSum; } return jumpSum; }};跳台阶问题升级版本:
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因为f(n-1)=f(n-2)+f(n-3)+...+f(1)
所以f(n)=2*f(n-1)
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因为f(n-1)=f(n-2)+f(n-3)+...+f(1)
所以f(n)=2*f(n-1)
class Solution {public: int jumpFloorII(int number) { int a = 1; return a << number - 1; //左移一位表示乘以2,2^number-1 }};
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路分析:
用归纳法归纳如下:
(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。
(3)当 n = 2时,存在两种情况。
(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。
... 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。
可以明确,n 时必定有 n-1时原来方式与2*1的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。
(4)如果我们现在归纳 n = 4,应该是什么形式?
4.1)保持原来n = 3时内容,并扩展一个 2*1 方块,形式分别为 “| | | |”、“= | |”、“| = |”
4.2)新增加的2*1 方块与临近的2*1方块组成 2*2结构,然后可以变形成 “=”。于是 n = 4在原来n = 3基础上增加了"| | ="、“= =”。
再自己看看这多出来的两种形式,是不是只比n = 2多了“=”。其实这就是关键点所在...因为,只要2*1或1*2有相同的两个时,就会组成2*2形式,于是就又可以变形了。
所以,自然而然可以得出规律: f(n) = f(n-1) + f(n-2), (n > 2)。
如果看了这一套理论还存在疑惑。可以尝试将题目改成1*3方块覆盖3*n、1*4方块覆盖4*n。
相应的结论应该是:
(1)1 * 3方块 覆 盖3*n区域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 *4 方块 覆 盖4*n区域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的结论,如果用1*m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。
(分析引自牛客网:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6)
程序思路:同以上斐波那契数列一样,直接递归计算,会报时间不够的问题,所以用循环结算,节省时间。
class Solution {public: int rectCover(int number) { if(number < 1) return 0; else if(number ==1 or number == 2){ return number; } else{ int result=0; int first = 1; int second = 2; for(int i = 3; i <= number; i++){ result =first + second; first = second; second = result; } return result; } }};
阅读全文
1 0
- 斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
- 斐波那契数列、跳台阶、变态跳台阶、矩形覆盖
- 剑指offer——斐波那契数列,跳台阶、变态跳台阶、矩形覆盖
- 剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶
- 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
- 斐波那契数列的变形---跳台阶及矩形覆盖
- 斐波那契数列变形之跳台阶问题
- 跳台阶\矩形覆盖\变态跳台阶
- 7、斐波那契数列 & 8、跳台阶 & 9、变态跳台阶
- 斐波那契数列变形之青蛙跳台阶
- 题目4-7 斐波那契数列、跳台阶、矩形覆盖
- 递归与循环--斐波那契数列、跳台阶、矩形覆盖
- 跳台阶 与 矩形覆盖 为啥都是斐波那契数列
- 剑指offer-算法题练习:part9 变态跳台阶-斐波那契数列问题
- 变态跳台阶 和 跳台阶 和 矩形覆盖
- 青蛙跳台阶、变态跳台阶、矩形覆盖
- 跳台阶/斐波那契数列
- 青蛙跳台阶问题&&斐波那契数列问题
- 安卓高手之路之java层Binder
- 我理解的剑指offer----字符串的全排列和组合算法
- POJ1003
- 智能音箱产业深度分析,你的客厅进入语音唤醒时代
- 安卓高手之路之 图形系统之 图形框架(1)
- 斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
- Java中获取文件大小的正确方法
- 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)
- gitlab配置腾讯企业邮箱
- 关于程序员职业生涯的两个概念和三个阶段
- 网页可以访问facebook,但无法ping通
- c#Process.Start()启动报错,双击正常打开
- Java生成指定长度的随机数
- 安卓高手之路 图形系统(3 底层SurfceFlinger系统)