入口

力扣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. 【记录】使用R2 CDN替换本地项目图片以加速图片加载

    将图片存储到 Cloudflare 的存储桶中,并通过其提供的公共 URL 来替换代码中的本地路径,可以减小项目中打包的图片文件体积 实现方法的详细步骤: 1. 上传图片到 Cloudflare 的存 ...

  2. 【量化读书笔记】【打开量化投资的黑箱】CH.04.风险模型

    风险管理不仅仅是规避风险和减少损失,是通过对敞口实施有目的的选择和规模控制来提高收益的质量和稳定性. (注:敞口,一般指金融活动中存在金融风险的部位以及受金融风险影响的程度) 本质上风险模型是为阿尔法 ...

  3. Graph DataBase介绍-图数据库

    前言分析社会关系这类复杂图壮结构的海量数据,使用图形数据库(Graph DataBase)是最好的选择.– 作者:李祎 <程序员>介绍各种NoSQL 数据库的文章已经很多,不过大部分都是基 ...

  4. 使用Vant做移动端对图片预览ImagePreview和List的理解

    使用Vant3做移动端的感受 最近在使用Vant3做移动端. 感觉还可以,使用起来也简单,但是也遇见一些坑. 图片预览ImagePreview的使用 在使用图片预览的时候, 我们在main.js中进行 ...

  5. 使用SOUI4的脚本模块

    SOUI4.1提供了全新的lua脚本模块支持,使用这个新版本的脚本模块,可以轻松将所有UI布局及业务逻辑全部使用XML+LUA实现,基本上就是一个超轻型浏览器. SOUI4.0相对于SOUI3最大的区 ...

  6. 第2章 C# 语言基础

    第2章 C# 语言基础 难点提纲 mindmap 第2章 C#语言基础 数值类型 数值字面量 溢出检查 特殊的浮点值 decimal 舍入误差 数组 简化初始化的<br/>两种方式 变量和 ...

  7. linux mint安装远程连接工具,类似于xshell的PAC

    从指定的URL下载文件 wget http://sourceforge.net/projects/pacmanager/files/pac-4.0/pac-4.5.5.7-all.deb   安装依赖 ...

  8. JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

    JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的? 最近要做一个项目升级,因为之前的项目中有用到ElasticSearch 7.10.1版本,在之前的漏扫环节时会出现Tomcat渗透为问题 ...

  9. JavaDoc文档的介绍及生成方法

    javaDoc命令是用来生成自己的API文档的 参数信息 @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @return 返回值情况 ...

  10. P3092 [USACO13NOV] No Change G 题解

    传送门 题解 思路 看到 \(1\le k\le16\),我们想到状压DP. 以每枚硬币是否被使用为状态,对其进行枚举. 令 \(dp_i\) 表示状态 \(i\) 下最多能支付到第 \(dp_i\) ...