斐波那契数列、跳台阶、变态跳台阶、矩形覆盖
来源:互联网 发布:网络教育考试时间 编辑:程序博客网 时间:2024/04/28 15:20
#include<iostream>#include<math.h>using namespace std;//斐波那契数列class Solution{public:int Fibonacci1(int n){/**第一种解法:递归————从上往下计算,重复计算太多,效率太低,不能满足时间要求*/if (n == 0)return 0;if (n == 1)return 1;return Fibonacci1(n - 1) + Fibonacci1(n - 2);}int Fibonacci2(int n){/**第二种解法:从下往上计算,减少重复计算*/int n0 = 0, n1 = 1;int ret;if (n == 0)ret = 0;if (n == 1)ret = 1;for (int i = 2; i <= n; i++){ret = n0 + n1;n0 = n1;n1 = ret;}return ret;}};//扩展1:青蛙跳台阶————一次可以跳1级,也可以跳2级,求跳N级的跳法种数。class Solution2{public:int jumpFloor1(int n){/**n=1:只有1种跳法;*n=2:两种跳法;*n>2:假设跳N级的跳法有f(n)种,* (1)第一次跳,跳1级,则剩下N-1级的跳法有f(n-1)种;* (2)第一次跳,跳2级,则剩下N-2级的跳法有f(n-2)种;* 所以:f(n) = f(n-1) + f(n-2)。*///if (n == 0 || n == 1)if (n == 1)return 1;if (n == 2)return 2;return jumpFloor1(n - 1) + jumpFloor1(n - 2);}int jumpFloor2(int number) {int n0 = 1, n1 = 2;int ret;if (number == 1)ret = 1;if (number == 2)ret = 2;for (int i = 3; i <= number; i++){ret = n0 + n1;n0 = n1;n1 = ret;}return ret;}int jumpFloor3(int number) {/**第3种解法:滚动数组*/int F[3] = { 0, 1, 2 };if (number <= 2){return F[number];}for (int i = 3; i <= number; i++){F[0] = F[1];F[1] = F[2];F[2] = F[0] + F[1];}return F[2];}};//扩展2:青蛙变态跳台阶————一次可以跳1级,也可以跳2级.....,也可以跳上N级台阶,求跳N级的跳法种数。class Solution3{public:int jumpFloorII(int number) {/**第1种解法:递归————从顶往下计算* f(n) = f(0)+f(1)+f(2)+f(3)+......+f(n-2)+f(n-1) ———— 第一次跳n,第一次跳n-1......*又 f(n-1) = f(0)+f(1)+f(2)+f(3)+......+f(n-2)*所以 f(n) - f(n-1) = f(n-1) -----> f(n) = 2 * f(n-1)*/if (number == 1)return 1;return 2 * jumpFloorII(number - 1);}int jumpFloorII1(int number) {/**第2种解法:从下往顶计算*最后剩下0个台阶,暂且定为0,直接跳n个台阶上来,显然只有一种方法(也就是说,对于任何一个“N”,我们都可以直接跳“N”,所以我们每次循环首先自加1就行了)*最后剩下1个台阶,那么共有(第n-1个台阶的方法数)种;*最后剩下2个台阶,共有(第n-2个台阶的方法数)种;*....*最后剩下n-1个台阶,只有一种方法。*累加上面每一种的方法,就是跳到第n阶台阶的总的跳法种数*/long long int arr[100] = { 0, 1 }; //限定最多跳100级for (int i = 2; i < 100; i++){int j = i - 1;arr[i]++; //直接跳跃到本身的"N"while (j){arr[i] = arr[i] + arr[j];j--;}}return arr[number];}int jumpFloorII2(int number) {/**第3种解法:用数学归纳法证明f(n)=2^(n-1)。*/return pow(2, number - 1);}int jumpFloorII3(int number) {/**第4种解法:滚动数组*/int F[2] = { 0, 1 };if (number < 2)return F[number];for (int i = 2; i <= number; i++){F[0] = F[1];F[1] = 2 * F[0];}return F[1];}};//扩展3:矩形覆盖————用number个2*1的矩形去覆盖更大的矩形(number*2),求总共的方法数。class Solution4 {public:int rectCover(int number) {if (number <= 0 || number == 1)return 1;if (number == 2)return 2;return rectCover(number - 1) + rectCover(number - 2);}int rectCover1(int number) {if (number == 1)return 1;if (number == 2)return 2;int n1 = 1, n2 = 2, tmp = 0;for (int i = 3; i <= number; i++){tmp = n1 + n2;n1 = n2;n2 = tmp;}return tmp;}};void main(){Solution4 s;cout << s.rectCover1(5) << endl;}
0 0
- 斐波那契数列、跳台阶、变态跳台阶、矩形覆盖
- 剑指offer——斐波那契数列,跳台阶、变态跳台阶、矩形覆盖
- 斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
- 剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶
- 跳台阶\矩形覆盖\变态跳台阶
- 7、斐波那契数列 & 8、跳台阶 & 9、变态跳台阶
- 题目4-7 斐波那契数列、跳台阶、矩形覆盖
- 递归与循环--斐波那契数列、跳台阶、矩形覆盖
- 跳台阶 与 矩形覆盖 为啥都是斐波那契数列
- 斐波那契数列的变形---跳台阶及矩形覆盖
- 变态跳台阶 和 跳台阶 和 矩形覆盖
- 青蛙跳台阶、变态跳台阶、矩形覆盖
- 跳台阶/斐波那契数列
- 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
- 剑指offer-算法题练习:part9 变态跳台阶-斐波那契数列问题
- Offer题9 斐波那契数列&青蛙跳台&矩形覆盖
- 用两个栈实现队列、旋转数组的最小数、斐波那契数列、青蛙跳台阶、矩形覆盖 --漫漫算法路 刷题篇
- 青蛙跳台阶(斐波那契数列应用)
- 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案
- 剑指offer之编程(八)
- 23.二叉树中和为某一值的路径(做第二遍时感觉仍有难度,第三次做还是要看一下思路)
- navicat 如何设置外键
- [bzoj3065]带插入区间K小值
- 斐波那契数列、跳台阶、变态跳台阶、矩形覆盖
- INSTALL_FAILED_CPU_ABI_INCOMPATIBLE -- 使用Genymotion出现错误
- php防盗链实现
- python 迭代器与生成器 详解
- android实现ListView或GridView中item的倒数功能
- HTTPS
- redis cluster 集群架构
- 个人总结软件开发
- 剑指offer刷题—二维数组的查找