剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
来源:互联网 发布:网络短信在线发送 编辑:程序博客网 时间:2024/04/28 19:12
提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160
参与人数:7267 时间限制:1秒 空间限制:32768K
题目描述
分析:
用递归会TLE,因为有不少地方进行了重复计算,改为循环即可解决(迭代法)...
另外为了避免输入非法值(比如负数),输入改为了unsigned int
| 1, (n=0)
fib(n)= | 1, (n=1)
| fib(n)+fib(n-1) (n>1, n∈N)
AC代码:
class Solution {public: int Fibonacci(unsigned int n) { int arr[2]={0,1}; if(n<2) return arr[n]; long long fib_2preN=0; // fib(0) long long fib_1preN=1; // fib(1) long long fib_N=0; for(int idx=2; idx <= n; idx++) { fib_N=fib_2preN+fib_1preN; fib_2preN=fib_1preN; fib_1preN=fib_N; } return fib_N; }};
剑指offer 面试题9 变形1(跳台阶)
提交网址: http://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161
- 题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70)。
- 输出:
对应每个测试案例,
输出该青蛙跳上一个n级的台阶总共有多少种跳法。
- 样例输入:
- 5
- 样例输出:
- 8
分析:
青蛙跳上n级台阶的跳法情况( s(n) ),第1次跳的时候有两种选择:
(1) 如果第1次跳时选择跳过1级台阶,那么还剩下n - 1级台阶,而跳上n – 1级台阶的跳法数目是s(n - 1);
(2) 如果第1次跳时选择跳过2级台阶,那么剩下n - 2级台阶,而跳上n – 2级台阶的跳法数目是s(n - 2)。
| 1, (n=1)
s(n)= | 2, (n=2)
| s(n)+s(n-1) (n>2, n∈N)
如果使用递归,会TLE超时,此处还是需要用迭代法...
AC代码:
class Solution {public: int jumpFloor(int n) { if(n<0) return 0; if(n==1) return 1; if(n==2) return 2; long long s_2preN=1; // s(1) long long s_1preN=2; // s(2) long long s_N=1; for(int idx=3; idx <= n; idx++) { s_N=s_2preN+s_1preN; s_2preN=s_1preN; s_1preN=s_N; } return s_N; }};
leetcode 70. Climbing Stairs
提交网址: https://leetcode.com/problems/climbing-stairs/
这有个奇怪的要求,n<0时,返回1
class Solution {public: int climbStairs(int n) { if(n<0) return 1; if(n==1) return 1; if(n==2) return 2; long long s_2preN=1; // s(1) long long s_1preN=2; // s(2) long long s_N=1; for(int idx=3; idx <= n; idx++) { s_N=s_2preN+s_1preN; s_2preN=s_1preN; s_1preN=s_N; } return s_N; }};
剑指offer 面试题9 变形2(变态跳台阶)
提交网址: http://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162
- 题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=50)。
- 输出:
对应每个测试案例,
输出该青蛙跳上一个n级的台阶总共有多少种跳法。
- 样例输入:
- 6
- 样例输出:
- 32
分析:
青蛙跳上n级台阶的跳法情况(s(n)),第1次跳的时候:
(1) 如果第1次跳时选择跳过1级台阶,那么还剩下n-1级台阶,而跳上n – 1级台阶的跳法数目是s(n-1);
(2) 如果第1次跳时选择跳过2级台阶,那么剩下n-2级台阶,而跳上n – 2级台阶的跳法数目是s(n-2)。
(3) 如果第1次跳时选择跳过3级台阶,剩下n-3台阶, 而跳上n –3级台阶的跳法数目是s(n-3)。
……
故总数为s(n) = s(n-1) + s(n-2) + … + s(2) + s(1) + s(0) .
s(n-1)= s(n-2) + … + s(2) + s(1) + s(0)
两式相减得:
s(n) =2*s(n-1)
s(1)=1
对于s(0),由s(2)=s(1)+s(0)=2可得s(0)=1.
| 1, (n=0)
s(n)= | 1, (n=1)
| 2*s(n-1) (n>1, n∈N)
依旧需要用迭代法...
AC代码:
class Solution {public: int jumpFloorII(int n) { if(n<0) return 0; if(n==0 || n==1) return 1; long long s_N=1; // s(1) for(int idx=2; idx <= n; idx++) { s_N=2*s_N; } return s_N; }};
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
剑指offer 面试题9(变形3) 矩形覆盖
提交网址: http://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6?tpId=13&tqId=11163
题目描述:
- 输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(0<=n<=70)。
- 输出:
对应每个测试案例,
输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。
样例输入:
4
样例输出:
5
分析:
2*n的覆盖方法情况总数为 f(n),假设2*n的大矩形高度为2(躺着放),当第一个2*1小矩形放在最左边的角落时:
(1) 如果第一个2*1小矩形选择竖着放,那么还剩下2*n-1的区域,而2*n-1区域的覆盖数目是f(n-1);
(2) 如果第一个2*1小矩形选择横着放,那么上面必须再放一个2*1小矩形,同时还剩下2*n - 2区域,而2*n-2区域的覆盖数目是f(n-2);
所以总数为f(n) = f(n-1) + f(n-2) .
f(1)=1
对于f(0),由f(2)=f(1)+f(0)=2可知 f(0)=1.
| 1, (n=0)
f(n)= | 1, (n=1)
| f(n)+f(n-1) (n>1, n∈N)
AC代码:
class Solution {public: int rectCover(int number) { if(number<0) return 0; // if(number<0 || number%2) return 0; 不需要考虑奇偶 if(number==0 || number==1) return 1; long long f_2preN=1; // f(0) long long f_1preN=1; // f(1) long long f_N=1; for(int idx=2; idx <= number; idx++) { f_N=f_2preN+f_1preN; f_2preN=f_1preN; f_1preN=f_N; } return f_N; }};
- 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
- 剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶
- 斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
- 剑指offer——斐波那契数列,跳台阶、变态跳台阶、矩形覆盖
- 【面试题】剑指Offer-9-斐波那契数列&&青蛙跳台阶
- 剑指offer面试题9 斐波那契数列及青蛙跳台阶问题
- 斐波那契数列的变形---跳台阶及矩形覆盖
- Offer题9 斐波那契数列&青蛙跳台&矩形覆盖
- 斐波那契数列、跳台阶、变态跳台阶、矩形覆盖
- 【剑指offer】面试题9:斐波那契数列
- 剑指offer 面试题9 斐波那契数列
- 剑指Offer:面试题9 斐波那契数列
- 剑指offer-面试题9:斐波那契数列
- 剑指offer 面试题9:斐波那契数列
- 【剑指offer】面试题9:斐波那契数列
- 剑指offer--面试题9:斐波那契数列
- 剑指offer:面试题9,斐波那契数列
- 剑指Offer---面试题9:斐波那契数列
- LeetCode Two Sum
- Ciel and Dancing
- C++第三次实验—友元类
- [HDU 4569] Special equations (数学+技巧+脑洞)
- stl关联容器
- 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
- 在CentOS搭建Git服务器
- SQL常用语句(补)
- R语言学习笔记1
- FastCgi与PHP-fpm关系
- HDU 1272 小希的迷宫
- eterna框架-介绍
- Kmeans算法详解及MATLAB实现
- ZOJ 3662 Math Magic(构造K个和为N且最小公倍数为M的正整数的方案数/dp)