首页 > 基础资料 博客日记
剑指offer-8、跳台阶
2025-07-02 09:30:02基础资料围观439次
文章剑指offer-8、跳台阶分享给大家,欢迎收藏Java资料网,专注分享技术知识
题⽬
⼀只⻘蛙⼀次可以跳上1级台阶,也可以跳上2级。求该⻘蛙跳上⼀个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1
输⼊:2
输出:2
解释:⻘蛙要跳上两级台阶有两种跳法,分别是:先跳⼀级,再跳⼀级或者直接跳两级。因此答案为2
示例2
输⼊:7
输出:21
示例3:
输⼊:0
输出:0
思路及解答
动态规划
这题和第7题 斐波那契数列 基本类似,只是换了一个题目表达方式。
青蛙跳到第n
级台阶的跳法数 dp[i] 取决于两种最后一步的选择:
- 从第
i-1
级跳1级:跳法数为 dp[i-1] - 从第
i-2
级跳2级:跳法数为 dp[i-2]
使用数组 dp
,其中 dp[i]
表示跳到第 i
级台阶的跳法数
状态转移: dp[i] = dp[i-1] + dp[i-2]
,初始化 dp[1] = 1
,dp[2] = 2
public int rectCover(int target){
if target <= 2{
return n
}
int[] dp = new int[n];
int dp[1] = 1;
int dp[2] = 2;
for (int i = 3; i <= target; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[target]
}
- 时间复杂度
O(n)
- 空间复杂度
O(n)
动态规划(滚动数组优化)
观察状态转移方程,发现当前状态仅依赖前两个状态(dp[i-1]
和 dp[i-2]
),因此只需保存这两个值,无需存储整个数组
public class Solution {
public int rectCover(int target) {
if (target <= 0) {
return 0;
}
if (target < 3) {
return target;
}
int num1 = 1; // 代表 dp[i-2]
int num2 = 2; // 代表 dp[i-1]
int result = 0;
for (int i = 3; i <= target; i++) {
result = num1 + num2;
//更新前两项
num1 = num2;
num2 = result;
}
return result;
}
}
- 时间复杂度
O(n)
- 空间复杂度
O(1)
如何思考空间优化方法?
- 观察状态依赖: 确认当前状态是否仅依赖有限的前几个状态(如斐波那契数列仅依赖前两项)
- 变量替换: 用固定数量的变量替代数组,滚动更新这些变量
- 边界处理: 初始化时需明确前几个状态的初始值(如
f(1)
和f(2)
)
文章来源:https://www.cnblogs.com/seven97-top/p/18953427
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- SpringBoot--如何整体读取多个配置属性及其相关操作
- 个人网站一键引入免费开关评论功能 giscus
- Java开发笔记(一百五十五)生成随机数的几种途径
- 榨干 Claude Code 的 16 个实用小技巧(高端玩法,建议收藏!)
- NBA巨星詹姆斯表变老嫂子了?这锅Viggle Ai得背/Ai视频创作/Ai魔性视频创作/Ai优质视频创作
- Java简历、面试、试用期、转正
- 使用Apollo配置中心,**静态字段通过`@Value`的setter方法可以实现热更新**
- vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
- MybatisPlus使用详情
- G1收集器:JVM垃圾回收的新一代王者