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

# -*- 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. MySQL 数据库类型

  2. k8s的概念

    Kubernetes(简称为 K8s),最初由 Google 的工程师开发和设计.Kubernetes 是用于自动部署.扩展和管理容器化应用程序的开源系统,它旨在提供跨主机集群的自动部署.扩展以及运行 ...

  3. Python-基础-day3

    基础数据类型 1.什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1 ...

  4. Ubuntu下安装Tensorflow

    本文目录 引言 基于Anaconda的tensorflow安装 1 下载linux版本的Anaconda安装包 2 安装Anaconda 利用anaconda安装tensorflow 1 建立一个 c ...

  5. BA-深化设计流程

    本文分三个层次描述了常规BA系统深化设计应包含了步骤和文件,第一个.第二个为转载别人的步骤,第三个为本人写的步骤. 深化系统大体步骤: 1.认真阅读招标文件,明确招标方需求. 2.仔细查阅图纸,确定被 ...

  6. NEFU 2

    其实就是筛选素数. 如,若能被2是质数,则2的倍数全是合数.如此循环. #include <iostream> #include <math.h> #include <c ...

  7. mysql安装出错cannot create windows service for mysql.error:0

    配置时最后一步出现不能启动mysql 解决成功的办法:[MySQL] Could not start the service MySQL 解决方法 安装mysql 5.1.33,在运行Server I ...

  8. [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)

    Problem 1686 神龙的难题 Accept: 444    Submit: 1365 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pro ...

  9. mysql事务的开启

    mysql事务的开启 对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况: 1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行 ...

  10. Caffe solver.prototxt学习

    在solver解决下面的四个问题: a.训练的记录(bookkeeping),创建用于training以及test的网络结构: b.使用前向以及反向过程对training网络参数学习的过程: c.对t ...