千家信息网

leetcode怎么解决青蛙跳台阶问题

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"leetcode怎么解决青蛙跳台阶问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2026年11月03日leetcode怎么解决青蛙跳台阶问题

本篇内容介绍了"leetcode怎么解决青蛙跳台阶问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

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

示例 1:

输入:n = 2

输出:2

示例 2:

输入:n = 7

输出:21

提示:

0 <= n <= 100

解题思路

设跳上 nn 级台阶有 f(n)f(n) 种跳法。在所有跳法中,青蛙的最后一步只有两种情况:跳上 11 级或 22 级台阶。

当为 11 级台阶:剩 n-1n−1 个台阶,此情况共有 f(n-1)f(n−1) 种跳法;

当为 22 级台阶:剩 n-2n−2 个台阶,此情况共有 f(n-2)f(n−2) 种跳法。

f(n)f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2) ,以上递推性质为斐波那契数列。本题可转化为 求斐波那契数列第 nn 项的值 ,与 面试题10- I. 斐波那契数列 等价,唯一的不同在于起始数字不同。

青蛙跳台阶问题:f(0)=1f(0)=1 , f(1)=1f(1)=1 , f(2)=2f(2)=2 ;

斐波那契数列问题:f(0)=0f(0)=0 , f(1)=1f(1)=1 , f(2)=1f(2)=1 。

斐波那契数列的定义是 f(n + 1) = f(n) + f(n - 1)f(n+1)=f(n)+f(n−1) ,生成第 nn 项的做法有以下几种:

递归法:

原理:把 f(n)f(n) 问题的计算拆分成 f(n-1)f(n−1) 和 f(n-2)f(n−2) 两个子问题的计算,并递归,以 f(0)f(0) 和 f(1)f(1) 为终止条件。

缺点:大量重复的递归计算,例如 f(n)f(n) 和 f(n - 1)f(n−1) 两者向下递归都需要计算 f(n - 2)f(n−2) 的值。

记忆化递归法:

原理:在递归法的基础上,新建一个长度为 nn 的数组,用于在递归时存储 f(0)f(0) 至 f(n)f(n) 的数字值,重复遇到某数字时则直接从数组取用,避免了重复的递归计算。

缺点:记忆化存储的数组需要使用 O(N)O(N) 的额外空间。

动态规划:

原理:以斐波那契数列性质 f(n + 1) = f(n) + f(n - 1)f(n+1)=f(n)+f(n−1) 为转移方程。

从计算效率、空间复杂度上看,动态规划是本题的最佳解法。

动态规划解析:

状态定义:设 dpdp 为一维数组,其中 dp[i]dp[i] 的值代表 斐波那契数列第 $i$ 个数字 。

转移方程:dp[i + 1] = dp[i] + dp[i - 1]dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n + 1) = f(n) + f(n - 1)f(n+1)=f(n)+f(n−1) ;

初始状态:dp[0] = 1dp[0]=1, dp[1] = 1dp[1]=1 ,即初始化前两个数字;

返回值:dp[n]dp[n] ,即斐波那契数列的第 nn 个数字。

空间复杂度优化:

若新建长度为 nn 的 dpdp 列表,则空间复杂度为 O(N)O(N) 。

由于 dpdp 列表第 ii 项只与第 i-1i−1 和第 i-2i−2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sumsum 使 a, ba,b 两数字交替前进即可 (具体实现见代码) 。

因为节省了 dpdp 列表空间,因此空间复杂度降至 O(1)O(1) 。

循环求余法:

大数越界:随着 nn 增大, f(n)f(n) 会超过 Int32 甚至 Int64 的取值范围,导致最终的返回值错误。

求余运算规则:设正整数 x, y, px,y,p ,求余符号为 \odot⊙ ,则有 (x + y) \odot p = (x \odot p + y \odot p) \odot p(x+y)⊙p=(x⊙p+y⊙p)⊙p 。

解析:根据以上规则,可推出 f(n) \odot p = [f(n-1) \odot p + f(n-2) \odot p] \odot pf(n)⊙p=[f(n−1)⊙p+f(n−2)⊙p]⊙p ,从而可以在循环过程中每次计算 sum = a + b \odot 1000000007sum=a+b⊙1000000007 ,此操作与最终返回前取余等价

代码实现

func numWays(n int) int {   if n==0{       return 1   }   if n<=2{       return n   }
a:=make([]int,n) a[0]=1 a[1]=2 c:=1000000007 for i:=2;i a[i]=(a[i-1]+a[i-2])%c } return a[n-1]}

"leetcode怎么解决青蛙跳台阶问题"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

台阶 数列 递归 数字 问题 青蛙 空间 复杂 复杂度 数组 动态 原理 情况 规划 输出 不同 两个 代码 内容 变量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 华服互联网科技怎么样 重庆互联网络科技 互联网 的科技创新 宜安科技 互联网金融 狮子座互联网科技有限公司 苏州大垚互联网科技 互联网科技视频素材 一五八零互联网科技 太原新华互联网科技学校怎么样 中国航天科技大学国际工业互联网 互联网科技扶贫时间 迪庆互联网科技招生 科技赋能视角下互联网保险发展 山东星卡互联网科技有限公司官网 广州千川互联网科技有限公司 城市宝互联网科技有限公司 下一代互联网重大应用科技园 互联网科技包装股份有限公司上市 互联网科技创新方面的资料 互联网医疗科技 互联网 科技创新 上海致骋互联网科技 工业互联网等科技实现智能化赋能 工业互联网科技创业 广州互联网高科技取餐柜 南京一网一红互联网科技有限公司 互联网界的黑科技 互联网科技手抄报图片 众联互联网络科技
0