面试题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. mybatis中怎样使用having?

    1.dao层代码 List<ErgTipSimpleBo> queryListMore(@Param("typeId") Integer typeId,@Param(& ...

  2. Linux任务计划命令 :crontab -e

    crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond ...

  3. 在centos7上配置jenkins

    在Linux(centos7)环境下配置jenkins,并用github作为仓库. 配置jenkins https://blog.csdn.net/wangfei0904306/article/det ...

  4. 15. Life Cycle of the Products 产品的生命周期

    15. Life Cycle of the Products 产品的生命周期 (1) We can see how the product life cycle works by looking at ...

  5. fiddler抓包工具总结

    Fiddler 抓包工具总结 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也 ...

  6. 算法学习笔记:knn理论介绍

    阅读对象:了解指示函数,了解训练集.测试集的概念. 1.简介 knn算法是监督学习中分类方法的一种.所谓监督学习与非监督学习,是指训练数据是否有标注类别,若有则为监督学习,若否则为非监督学习.所谓K近 ...

  7. What's the Difference Between Iterators and Generators in Python

    https://www.quora.com/Whats-the-difference-between-iterators-and-generators-in-Python

  8. VS Code 之 smarty 扩展

    VS Code 中的 Smarty 扩展: https://github.com/imperez/vscode-smarty 目前(v0.2.0)不支持定制定界符.可以通过 trick 的方式篡改. ...

  9. <笔记>TP5的分页传递额外参数

    默认生成的分页只有page一个参数,若需要提供额外的参数才能访问分页(例如查询结果的分页,需要传入查询关键字的参数才能显示结果),则需要设置额外参数query

  10. 网络编程——I/O复用

    int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timev ...