C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖)
提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160
参与人数:7267 时间限制:1秒 空间限制:32768K
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项 Fibonacci(int n)。
分析:
用递归会TLE,因为有不少地方进行了重复计算,改为循环即可解决(迭代法)...
另外为了避免输入非法值(比如负数),输入改为了unsigned int
\(fib(n)=\begin{cases} 1 & n=0 \\
1 & n=1 \\
fib(n)+f(n-1) & n > 1 \ and \ n \in N \end{cases}\)
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)。
\(s(n)=\begin{cases} 1 & n=1 \\
1 & n=2 \\
s(n)+s(n-1) & n > 2 \ and \ n \in N \end{cases}\)
如果使用递归,会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.
\(s(n)=\begin{cases} 1 & n=0 \\
1 & n=1 \\
2\cdot s(n) & n > 1 \ and \ n \in N \end{cases}\)
依旧需要用迭代法...
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;
}
};
剑指offer 面试题9(变形3) 矩形覆盖
提交网址: http://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6?tpId=13&tqId=11163
题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数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.
\(f(n)=\begin{cases} 1 & n=0 \\
1 & n=1 \\
f(n)+f(n-1) & n > 1 \ and \ n \in N \end{cases}\)
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;
}
};
C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解的更多相关文章
- 剑指Offer - 九度1387 - 斐波那契数列
剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...
- 【剑指offer】9、斐波拉契数列
面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...
- 剑指offer【07】- 斐波那契数列(java)
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...
- 剑指offer(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...
- 【剑指Offer】7、斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39. 解题思路: 斐波那契数列:0,1,1,2,3, ...
- 【剑指offer】7:斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...
- (1)剑指Offer之斐波那契数列问题和跳台阶问题
一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...
随机推荐
- 【Selenium】【BugList1】调用firefox浏览器,报 TypeError: 'module' object is not callable
#coding=utf-8 from selenium import webdriver driver=webdriver.firefox() 解决方法:firefox改为Firefox
- 使用kbmmw 生成REST 服务OpenAPI函数原型
我们以前介绍了很多kbmmw 开发REST 的例子.一直有个问题困惑着大家. 我们提供REST 服务,如何让客户端快速的使用,当然可以写文档,但是一旦 后台改变了,又要再一次给调用者发新文档,非常的麻 ...
- 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF
当要往有设置自增标识字段的表插入数据,并希望同时设置好自增字段的值时,可以在insert into 的SQL语句前后分别加上一句sql语句,SET IDENTITY_INSERT TableName ...
- Java File类与文件IO流总结
1.File类 File类被定义为“文件和目录路径名的抽象表示形式”,这是因为File类既可以表示“文件”也可以表示“目录”,他们都通过对应的路径来描述.通过构造函数创建一个File类对象,则该对象就 ...
- oracle RAC
RAC安装步骤 1 配置共享存储 2 Grid Infrastructure软件的安装,GI主要用于cluster ,storage的管理 3 安装数据库软件 ...
- Python基础知识当中容易混淆的几个知识点
在Python的基础知识当中,对于类实现可迭代功能有了一种新的方式,而这种方式则有别于我们学.NET等其他高级语言. 在Python当中,目前常用的有两种方式来实现这种迭代器的返回:__iter__ ...
- post推送消息时的乱码
URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求 ...
- 关于浏览器跨域的一种实现--jsonp
最近一直在搞python,前端技术荒废很久了,今天跟前端联调,设计到一个前端跨域的问题:前端人员告诉我可以用jsonp的方式实现,经他这么一提醒,也是豁然开朗. jsonp的实现方式我按照我的理解说一 ...
- .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上(ZT)
本文转载 https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,感谢 吕毅 (包含链接: https://walte ...
- Dubbo 源码分析 - 集群容错之 Cluster
1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...