跳台阶是斐波那契数列的一个典型应用,其思路如下:

# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.value=[0]*50
def jumpFloor(self, number):
# write code here
self.value[0]=1
self.value[1]=2
for i in range(2,number):
self.value[i]=self.value[i-1]+self.value[i-2]
return self.value[number-1]

这里为了避免递归的低效率,采用数组遍历的方式。 时间复杂度依旧为O(n).

仔细观察‘变态跳台阶’,其思路其实和‘跳台阶很类似’,如下:

f(1) = 1    //n = 1时,只有1种跳法,f(1) = 1

f(2) = 2        //n = 2时,会有两个跳得方式,一次1阶或者2阶

n>=3时:

f(3) = f(1) + f(2) + 1   //最后的1表示3阶一次跳3阶的一种方法

...

f(n) = f(1) + f(2) +  ... + f(n-3) + f(n-2) + f(n-1) + 1

# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.value=[0]*50
def jumpFloorII(self, number):
# write code here
if number==0:
return -1
self.value[0]=1
self.value[1]=2
for i in range(2,number):
m=0
while m<=i-1: #注意这里从f(1)+....+f(n-1)的条件
self.value[i]+=self.value[m]
m+=1
self.value[i]+=1  
return self.value[number-1]

但是上述方法其实还可以简化:

由上我们已经得到:  f(n) = f(1) + f(2) +  ... + f(n-3) + f(n-2) + f(n-1) + 1

设 f(0) = 1,则上述可变为: f(n) = f(0) + f(1) + f(2) +  ... + f(n-3) + f(n-2) + f(n-1)

同时也有: f(n-1) = f(0) + f(1) + f(2) +  ... + f(n-3) + f(n-2)  代入上式有: f(n) = 2*f(n-1)

前提 f(0)=1(但是没有0阶台阶的,这只是用来推导,没有实际意义), f(1)=1, 可以得到:

f(2)=2, f(3)=4, f(4)=8, f(5)=16....

从而得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

| 1       ,(n=0 )

f(n) =     | 1       ,(n=1 )

              | 2*f(n-1),(n>=2)
class Solution:
def __init__(self):
self.value=[0]*50
def jumpFloor(self, number):
# write code here
if number==0:
return -1
self.value[0]=1 #没有0阶台阶
self.value[1]=1
for i in range(2,number+1):
self.value[i]=2*self.value[i-1]
return self.value[number]

[剑指offer] 8+9. 跳台阶+变态跳台阶 (递归 时间复杂度)的更多相关文章

  1. 【剑指Offer】面试题10- II. 青蛙跳台阶问题

    题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...

  2. 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归

    剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...

  3. [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

    跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...

  4. 【校招面试 之 剑指offer】第10-2题 青蛙跳台阶问题

    题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个n级台阶共有多少种跳法? 题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶...也可以一次跳n级台阶.求该青蛙跳上一个 ...

  5. 《剑指offer》— JavaScript(8)跳台阶

    跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 实现代码 function jumpFloor(number) { if (number& ...

  6. 《剑指offer》面试题10- II. 青蛙跳台阶问题

    问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...

  7. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  8. 剑指Offer 7. 斐波那契数列 (递归)

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题目地址 https://www.nowcoder.com/prac ...

  9. 【剑指offer】斐波那契数列非递归求解第N项

    public class Solution { public int Fibonacci(int n) { //错误输入处理 if(n<0) return -1; int pre = 1; in ...

  10. [剑指Offer]判断一棵树为平衡二叉树(递归)

    题目链接 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=0&tqId=0&rp=2&a ...

随机推荐

  1. 3.2、Ansible单命令测试

    0.Ansible的group支持all.通配符(*).IP地址 1.查看Ansible的版本 $  ansbile  --version [root@test ~]# ansible --versi ...

  2. Windows常用软件

    目录 Uninstall Tool FACapture Unlocker Uninstall Tool Uninstall Tool 这是一款可以彻底删除应用的软件,能连通注册表内容一起删除. FAC ...

  3. 【codeforces 805B】3-palindrome

    [题目链接]:http://codeforces.com/contest/805/problem/B [题意] 让你生成一个只包含a,b,c的字符串; 要求c出现的次数最少,且任意一个 长度为3的子串 ...

  4. python 中的一些小命令

  5. 工具-VIM常用快捷键

    使用vs code 的插件 amvim来快速编辑代码,要熟记下面的命令 由normal模式切换到insert模式的命令键 i 在光标左侧输入正文 I 在光标所在行的行首输入正文 a 在光标右侧输入正文 ...

  6. 洛谷—— P1238 走迷宫

    https://www.luogu.org/problem/show?pid=1238 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走 ...

  7. 遗传奥秘的伟大揭秘者:J.Watson

    J.Watson的近照: 人们公认,揭秘生命体的遗传奥秘(DNA)是二十世纪最伟大的科技成果之中的一个,或许就是人类最伟大的科技进步(而不是"之中的一个"). 上世纪是人类做出伟大 ...

  8. QT使用tableWidget显示双排列表 而且选中用红框圈出来

    如需转载请标明出处:http://blog.csdn.net/itas109 整个project下载地址:http://download.csdn.net/detail/itas109/7607735 ...

  9. ES JVM使用如果超过75%就会GC较多,导致ES索引性能下降

    转自:https://www.elastic.co/guide/en/cloud/current/ec-metrics-memory-pressure.html Scenario: How Does ...

  10. iris中间件

    最近使用golang写的时候涉及到权限校验,用中间件(使用iris框架内的东西) 自己摸索出一种自己的方式 iris.UseFunc(MiddlewareFunc)使用这个方法,会在所有的请求之前执行 ...