题目:

给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法。

举例:

N=3,可以三次跨一个台阶,也可以先跨2再跨1,也可以先跨1再跨2,共三种走法。

思路:

如果台阶只有1级,方法只有一种,如果台阶有两级,方法有两种。如果台阶有N级,最后跳上第N级台阶时,要么从N-2级台阶直接跨2级,要么从N-1级跨1级上去。所以台阶有N阶的方法为跨到N-2级台阶的方法数加上跨到N-1级台阶的方法数。即S(N)=S(N-1)+S(N-2)

S(1)=1 S(2)=2 。

例如台阶为5阶:(共八种)

先跨3阶,1 1 1,1 2, 2 1,最后一步跨 2(共三种)

先跨4阶,1 1 1 1,1 1 2,1 2 1,2 1 1 ,2 2,最后一步跨1(共五种)

类似于斐波那契数列:

方法一: 暴力递归

    public static int s1(int N) {if (N == 1) {return 1;}if (N == 2) {return 2;}return s1(N-1) + s1(N-2);}

方法二:O(N)

    public static int s2(int N) {if (N < 1) {return 0;}if (N == 1 || N ==2) {return N;}int res = 2;int pre = 1;int tmp = 0;for (int i = 3; i <= N; i++) {tmp = res;res += pre;pre = tmp;}return res;}

方法三:(使用矩阵乘法)

S(N)=S(N-1)+S(N-2)是一个二阶递推数列,用上篇博客的矩阵乘法的方法,根据前四项

 代码实现:

代码中的matrixPower方法在这篇博客介绍:斐波那契数列问题

    public static int s3(int N) {if (N < 1) {return 0;}if (N == 1 || N ==2) {return N;}int[][] base = {{1,1},{1,0}};int[][] res = matrixPower(base, N-2);return 2*res[0][0] + res[1][0];}

斐波那契问题——上台阶问题相关推荐

  1. 小乐乐上台阶【斐波那契】

    描述 小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法? 输入描述: 输入包含一个整数n (1 ≤ n ≤ 30) 输出描述: 输出一个整数,即小乐乐 ...

  2. 算法---斐波那契思想

    1.主要框架:f(n)=f(n-1)+f(n-2) 用不同的方法求解斐波那契数列的时间效率大不相同.第一种基于递归的解法虽然直观但时间效率很低,在实际软件开发中不会用这种方法,也不可能得到面试官的青睐 ...

  3. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  4. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  5. 剑指offer:面试题10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...

  6. 斐波那契算法举例(iterative Fibonacci algorithm)

    // count_change.cpp : Defines the entry point for the console application. // #include "stdafx. ...

  7. BZOJ2275[Coci2010]HRPA——斐波那契博弈

    题目描述 N个石子,A和B轮流取,A先.每个人每次最少取一个,最多不超过上一个人的个数的2倍. 取到最后一个石子的人胜出,如果A要有必胜策略,第一次他至少要取多少个. 输入 第一行给出数字N,N< ...

  8. 用递归法计算斐波那契数列的第n项

     斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  9. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

最新文章

  1. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7.5 使用StAX写出XML文档
  2. 中秋节前,送一波福利
  3. 简单工厂模式(详细)(举例饮料)
  4. python分割文件目录/文件名和后缀
  5. 基于Mac自带nginx、php,配置php服务器
  6. 一、tars简单介绍 二、tars 安装部署资料准备
  7. Python MD5
  8. windows加域后的问题
  9. 蓝桥杯枚举+判断结果填空:猜年龄/奇妙数字
  10. VC6和VS2005(及2010)的一些区别总结
  11. DXperience 9.1.3
  12. 施工员简历英语计算机水平,土建施工员电子版英文简历模板
  13. 微信小程序 —— 成员管理及开发管理
  14. Java在手机平台上的Porting
  15. JavaScript基础知识总结 18:dom基本操作
  16. 表中数据的更改量保存视图
  17. Codeforces Round #807 (Div. 2)(A-D)
  18. 元数据是什么意思_中国股市:股票分红10转10股派5元,你看懂是什么意思了吗?...
  19. Linux中的括号用法
  20. C# 矩阵库 功能特别强大!!

热门文章

  1. INFO zkclient.ZkEventThread - Starting ZkClient
  2. oracle 错误代码
  3. 构造和析构函数调用顺序
  4. matlab怎么求三次微分,Matlab – 求解三阶微分方程
  5. Linux下默认字体是什么,linux默认字体是什么
  6. 计算机网络及因特网的基本知识,计算机网络基本知识
  7. 初识Java ~ (二) # Java 中程序的执行流程,(万字长文)特别细~ 可收藏~
  8. 自学软件测试1个半月上岸拿5个offer
  9. JS实现右键拖动元素
  10. matlab 函数,matlab 语法1