入口

力扣https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
        输出:2
示例 2:

输入:n = 7
        输出:21
示例 3:

输入:n = 0
        输出:1
提示:

0 <= n <= 100

斐波那契数列

青蛙跳台阶问题是一种经典的动态规划问题,可以通过类比斐波那契数列来求解。问题的关键在于理解青蛙跳跃的可能路径:

  • 第1级台阶:只有 1 种方法,即青蛙直接跳1级到达目标。

  • 第2级台阶:有 2 种方法:

    1. 跳1级,然后再跳1级:青蛙可以选择先跳到第1级台阶,然后再跳1级到第2级。
    2. 直接跳2级:青蛙可以选择直接从地面跳到第2级。
  • 第n级台阶(n > 2):对于任意第n级台阶,青蛙有两种可能的最后一步:

    1. 从第(n-1)级台阶跳1级:青蛙可以先跳到第(n-1)级台阶,然后再跳1级到达第n级。
    2. 从第(n-2)级台阶跳2级:青蛙可以先跳到第(n-2)级台阶,然后直接跳2级到达第n级。

这个思路的核心在于,每个台阶的到达方法数是基于前两个台阶的方法数之和,因为青蛙可以选择跳1级或者2级。

递推公式:F(n) = F(n-1) + F(n-2)

方法一:递归

Java示例

class Solution {
public int climbStairs(int n) {
if(n==1 || n==2){
return n;
}
return climbStairs(n-1) + climbStairs(n-2);
}
}

时间复杂度:O(2^n)

空间复杂度:O(n)

方法二:记忆递归

方法一缺点: 多了很多重复计算(如红框圈出来的地方),记忆递归的讲每次计算结果存储,不再重复计算。

方法一复杂度分析

Java示例

class Solution {
public int climbStairs(int n) {
int memo[] = new int[n+1];//存储计算结果
return climb(memo,n);
}
public int climb(int[] memo,int n){
if(n==1 || n==2){
memo[n] = n;
}
if(memo[n] == 0){
memo[n] = climb(memo,n-1) + climb(memo,n-2);
}
return memo[n];
}
}

时间复杂度:O(n)

空间复杂度:O(n)

方法三:动态规划

Java示例

class Solution {
public int climbStairs(int n) {
if(n==1 || n==2){
return n;
}
int dp[] = new int[n+1];
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n-1] + dp[n-2];
}
}

时间复杂度:O(n)

空间复杂度:O(n)

方法四:斐波那契数列

在方法一的dp数组中只有两个元素被使用,现在将浪费的空间优化掉,将空间复杂度降为O(1)

Java示例

class Solution {
public int climbStairs(int n) {
if(n==1 || n==2){
return n;
}
int first=1;
int second = 2;
for(int i=3;i<n;i++){
int third = first + second;
first = second;
second = third;
}
return first + second;
}
}

时间复杂度:O(n)

空间复杂度:O(1)

[每日算法 - 华为机试] 剑指 Offer 10- II. 青蛙跳台阶问题的更多相关文章

  1. 【剑指Offer】10- II. 青蛙跳台阶问题 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 动态规划 日期 题目地址:https: ...

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

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

  3. 剑指Offer - 九度1388 - 跳台阶

    剑指Offer - 九度1388 - 跳台阶2013-11-24 03:43 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包 ...

  4. 【剑指offer】09-3变态跳台阶

    原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记,笔记索引连接 1.题目 # 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的 ...

  5. 剑指offer 09:变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. /* f(n-1) = f(n-2) + f(n-3) + ... + f(0 ...

  6. 剑指offer(8)跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题目分析 题目很简单,稍微分析就知道这是斐波那契数列,所以可以动态规划来做 a.如果两种跳法,1阶 ...

  7. 剑指offer九之变态跳台阶

    一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 1.关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) ...

  8. 【剑指Offer】8、跳台阶

      题目描述:   一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果).   解题思路:   首先考虑最简单的情况,如果只有1级台阶, ...

  9. 剑指offer 11:变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   解法:使用数学归纳法可得,跳n级台阶的跳法一共有f(n)=2n-1中,即本 ...

  10. 剑指offer【09】- 跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 对于本题,前提只有 一次 1阶或者2阶的跳法. a.如果两种跳法,1阶或者 ...

随机推荐

  1. (七).NET6.0部署RabbitMQ

    1.下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 2.Rabbitmq官网下载地址: https://www.rabbitmq.com/d ...

  2. Solution Set -「AGC 007~009」C~F

    目录 「AGC 007C」Pushing Balls 「AGC 007D」Shik and Game 「AGC 007E」Shik and Travel ^ 「AGC 007F」Shik and Co ...

  3. springcloud-路由gateway-zuul

    spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已.因为zuul ...

  4. Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

  5. React、Angular、Vue.js三者比较指南

    Vue-React-Angular三者区别   1. 基本概念Angular 是一个应用设计框架与开发平台,用于创建高效.复杂.精致的单页面应用. React 是一个用于构建用户界面的 JavaScr ...

  6. kali 安装

    准备 选用系统: kali-linux-2018.1-amd64.iso     kali-linux-2020.2-installer-amd64.iso 开始 2018版 1.选用图形化安装 2. ...

  7. oracle19.3打补丁

    补丁 36582781 - 数据库发布更新 19.24.0.0.240716 本文档在发布时准确无误.有关数据库版本更新 19.24.0.0.240716 的任何更改和其他信息,请参阅 My Orac ...

  8. .NET最佳实践:避免滥用Task.Run

    在 C# 中,Task.Run 是用来在后台线程中执行异步任务的一个常见方法. 它非常适用于需要并行处理的场景,但如果不加以谨慎使用,可能会导致额外的线程池调度,进而影响程序的性能. 什么是线程池? ...

  9. Luogu P11553 ROIR 2016 Day 1 奇怪的字符串 题解 [ 绿 ] [ 后缀自动机 ] [ 枚举 ] [ 观察 ]

    奇怪的字符串:需要一点观察的 SAM 小清新题. 观察 我们首先观察什么样的字符串才是奇怪的,可以发现,首先类似 AAAAAAA 之类全部相等的字符串是奇怪的. 继续观察,如果字符种类变为两种或者三种 ...

  10. P5384 [Cnoi2019] 雪松果树 题解

    传送门 前言 一年一度,生长在高山上的雪松果树又结果了. 第二天,雪松果树长成了一颗参天大树, 上面长满了雪松果. 求雪松果树生长周期 整活向题解. 奋力卡常 3h,纪念一下. 是的,我一个人的提交占 ...