当前位置: 首页 > news >正文

Leetcode 03 java

爬楼梯算法

现在只看明白动态规划,也没有很难哟!!

题目
70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
java题解
class Solution {public int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
}

这个爬楼梯算法实际上是一个经典的动态规划问题,也可以看作是斐波那契数列的变种。让我来详细解释一下:

问题理解

假设你正在爬楼梯,需要n阶才能到达楼顶。每次你可以爬 1 或 2 个台阶。问有多少种不同的方法可以爬到楼顶?

例如:

  • n=2时,有两种方法:1+1 或直接 2 步
  • n=3时,有三种方法:1+1+1、1+2、2+1
  • n=4时,有五种方法:1+1+1+1、1+1+2、1+2+1、2+1+1、2+2

动态规划思路

动态规划的核心是将大问题分解为小问题,并存储小问题的解避免重复计算。

对于爬楼梯问题,关键观察点是:

  • 到达第i阶楼梯的方法数 = 到达第i-1阶的方法数(再爬 1 步) + 到达第i-2阶的方法数(再爬 2 步)
  • 即状态转移方程:dp[i] = dp[i-1] + dp[i-2]

代码解释

你提供的代码正是基于这个思路实现的,只不过使用了滚动数组优化空间复杂度:

java

public int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q;     // p 记录 dp[i-2] 的值q = r;     // q 记录 dp[i-1] 的值r = p + q; // r 计算当前 dp[i] = dp[i-1] + dp[i-2]}return r;
}

执行过程示例

n=3为例:

  1. 初始状态:p=0q=0r=1
  2. 循环开始:
    • i=1p=0q=1r=p+q=1 → 到达第 1 阶有 1 种方法
    • i=2p=1q=1r=p+q=2 → 到达第 2 阶有 2 种方法
    • i=3p=1q=2r=p+q=3 → 到达第 3 阶有 3 种方法
  3. 返回结果:r=3

复杂度分析

  • 时间复杂度:O (n),只需遍历一次
  • 空间复杂度:O (1),只使用了三个变量

这种优化方法避免了创建长度为n的数组,在空间效率上更高。本质上,这个问题和斐波那契数列的计算是一样的,只是起始条件略有不同(斐波那契通常从 0 和 1 开始,而爬楼梯这里从 1 和 1 开始)。

http://www.lryc.cn/news/591597.html

相关文章:

  • 记录Leetcode中的报错问题
  • Java数组补充v2
  • sqli-labs靶场通关笔记:第25-26a关 and、or、空格和注释符多重过滤
  • 融智兴科技: RFID超高频洗涤标签解析
  • 代码随想录算法训练营第二十三天
  • Java 中的类和对象
  • 数据结构自学Day9: 二叉树的遍历
  • Git简介与特点:从Linux到分布式版本控制的革命
  • redis中间件
  • git merge-base查看某个分支从哪里拉出来的、主main分支上的某个时间之后某人的提交合并到特定分支(使用 cherry-pick 的场景)
  • 【MySQL事务】事务的隔离级别
  • 逆向破解京东评论加密参数|Python动态Cookie解决方案
  • 开源Agent平台Dify源码剖析系列(五)核心模块core/agent之CotChatAgentRunner
  • 文字转图片的字符画生成工具
  • 今日行情明日机会——20250717
  • Web3.0 实战项目、简历打造、精准投递+面试准备
  • springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
  • 流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 `<think>` 标签
  • 面试高频题 力扣 200.岛屿数量 洪水灌溉 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • 【Lua】题目小练1
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GoodCheapFast(Good - Cheap - Fast三选二开关)
  • yolo8+ASR+NLP+TTS(视觉语音助手)
  • RK3566开发板调试记录:从编译配置到功能优化
  • 杰理AC70NN项目用脚本自定义添加.mk文件,直接链接进主Makefile脚本编译
  • 微服务的编程测评系统3-加密-日志-apifox-nacos-全局异常
  • 用Python实现神经网络(一)
  • RuoYi-Cloud 定制微服务
  • 微服务网站开发学习路线与RuoYi-Cloud实战指南
  • 迅速高效从web2到web3转型 ,开启远程工作
  • 验证损失判断过拟合情况