【剑指offer】面试题10 斐波那契数列与跳台阶

1.考点

  • 考点1:斐波那契数列的多种实现方式掌握,以及其变种的掌握(前移或后移);
  • 考点2:对于递归与循环的概念的理解程序;

2.思想

  • 思想的核心就是要知道,使用递归代码确实会简洁,但是会导致不必要的内存占用率;而使用循环往往代码结构较为复杂一些,不过内存占用很少,结合两种思想的动态规划方法相对来说最简洁且空间利用率也低,不过传统的递归时间复杂度为O(2^n),而改进后的众多迭代、递归与动态规划也均为O(n)复杂度,要实现更低的时间复杂度,需要一些很骚的操作。
  • 对于不同的跳台阶问题,如果规定的是只能1和2,那就从最后一步开始思考,即最后一步只有跳2和跳1两种跳法,跳2的话,那么之前的台阶算法为f(n-2),跳1的话,那么之前的台阶算法为f(n-1),所以得到f(n)=f(n-2)+f(n-1),这就是一个斐波那契数列,不过其初始值前移了一位,即f(1) = 1,f(2) = 2, f(3) = 3这样。
  • 对于变态跳台阶问题,跳的规定有1到n这么多种,那么仍然以最后一步作为思考,其有1-n共n种跳法,那么易得f(n) = f(n-1)+f(n-2)+……+f(1)+f(0),而同理的,f(n-1)=f(n-2)+f(n-3)+……+f(1)+f(0)这样也能出现,所以综合得到f(n)=2*f(n-1)这样一个标准的等比数列通项公式,结果也就轻而易举得到an = 2^(n-1)了。

3.代码

  • 注意使用位运算符提高效率
#include <iostream>
using namespace std;

//牛客网都是3ms,384K
//菲波那切数列问题
class Solution1 
{
public:
	int Fibonacci(int n)
	{
		return [&n]() {int f = 1, s = 0; while (n--) { s = f + s; f = s - f; } return s; }();
	}
};

//跳台阶问题,就是斐波那契问题,比标准的前移了一位,用一个常规的动态规划写法写
class Solution 
{
public:
	int jumpFloor(int number) 
	{
		int first = 1;      //f(-1)
		int second = 0;		//f(0)
		while (number--)
		{
			second = first + second;
			first = second - first;
		}
		return second;
	}
};

//变态跳台阶问题,使用数学归纳法得到其通项公式为an = 2^(n-1)
//牛客网3ms,460K
class Solution2
{
public:
	int jumpFloorII(int number)
	{
		return 1 << (number - 1);
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸间沧海桑田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值