面试题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:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解的更多相关文章

  1. 剑指Offer - 九度1387 - 斐波那契数列

    剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...

  2. 【剑指offer】9、斐波拉契数列

    面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...

  3. 剑指offer【07】- 斐波那契数列(java)

    题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...

  4. 剑指offer(7)斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...

  5. 【剑指Offer】7、斐波那契数列

      题目描述:   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39.   解题思路:   斐波那契数列:0,1,1,2,3, ...

  6. 【剑指offer】7:斐波那契数列

    题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...

  7. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  8. 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题

     本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...

  9. (1)剑指Offer之斐波那契数列问题和跳台阶问题

    一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...

随机推荐

  1. 对 JSON 数据进行序列化和反序列化

    如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...

  2. AHOI——Day1个人感悟

    今天,是个bilibili的日子.(嗯?什么意思?) 洛谷已经尽力了: 于是我带着洛谷的祝福,来到了AHOI的考场--合肥一中. 其实我是考完才签到的,我一大早五点多就起来了,到考场后,在肯德基吃了早 ...

  3. Eclipse 安装 AmaterasUML 插件

    网上很多Eclipse 安装UML插件教程,可能对高版本Eclipse都无法安装成功,本文提供的安装方式,亲测可用. 一.安装GEF插件 1.打开eclipse官网 https://www.eclip ...

  4. 别人的Linux私房菜(14)Linux账号管理和ACL权限设置

    用户标识符UID.GID 用户的账号信息,主要是指UID对应.组和GID对应 检查系统中是否存在用户bin:id bin 登录shell验证账号密码的步骤:找到/etc/passwd核对是否存在账号, ...

  5. BERT(Bidirectional Encoder Representations from Transformers)

    BERT的新语言表示模型,它代表Transformer的双向编码器表示.与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示.因此,预训练的BERT表示可以通过 ...

  6. 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)

    传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...

  7. css3用到知识点小结

    属性 默认值 属性值及其描述 animation-name 默认值:none 规定需要绑定到选择器的 keyframe 名称. keyframename 规定需要绑定到选择器的 keyframe 的名 ...

  8. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...

  9. 【repost】让你一句话理解闭包(简单易懂)

    接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下. 本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出 ...

  10. Django积木块五——分页

    分页 django本身带有分页功能,为什么要用他呢?因为它的代码更为简洁,并且在做筛选的时候会把url中的所有参数都组装起来,并且加上分页.也就是做筛选中的结果也可以用这个分页. pip instal ...