剑指 Offer 10- II. 青蛙跳台阶问题
2021/6/19 0:02:46
本文主要是介绍剑指 Offer 10- II. 青蛙跳台阶问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
标签:递归、动态规划
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
输入:n = 2 输出:2 输入:n = 7 输出:21 输入:n = 0 输出:1
提示:
0 <= n <= 100
分析
这道本质上还是斐波那契数列,只是初始值不一样,斐波那契数列f(0) = 0, f(1) = 1,而这里f(0) = f(1) = 1。
定义dp[i]表示跳上一个i级台阶的跳法数,则dp[0] = dp[1] = 1,对于任意i(i >=2),跳上i级台阶可以通过跳1级或者跳2级到达,所以dp[i] = d[i - 1] + dp[i - 2]
对于本题,可以使用动态规划或者递归求解,使用递归需要保存计算过程中重复出现的项,减少运算时间。而使用动态规划,因为只和两个状态有关,所以空间复杂度可以由O(n)降为O(1)
编码
递归版本:
class Solution { int[] cache = new int[101]; public int numWays(int n) { if (n == 0 || n == 1) { return 1; } if (cache[n] != 0) { return cache[n]; } cache[n] = (numWays(n - 1) + numWays(n - 2)) % 1000000007; return cache[n]; } }
动态规划,空间复杂度O(n):
class Solution { public int numWays(int n) { if (n == 0 || n == 1) { return 1; } int[] dp = new int[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007; } return dp[n]; } }
动态规划,空间复杂度O(1):
class Solution { public int numWays(int n) { if (n == 0 || n == 1) { return 1; } int res = 0, a1 = 1, a2 = 1; for (int i = 2; i <= n; i++) { res = a1 + a2; if (res >= 1000000007) { res = res % 1000000007; } a1 = a2; a2 = res; } return res; } }
这篇关于剑指 Offer 10- II. 青蛙跳台阶问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略