Leetcode 03 java

爬楼梯算法

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

题目
java 复制代码
70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 
java题解
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

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=0, q=0, r=1
  2. 循环开始:
    • i=1: p=0, q=1, r=p+q=1 → 到达第 1 阶有 1 种方法
    • i=2: p=1, q=1, r=p+q=2 → 到达第 2 阶有 2 种方法
    • i=3: p=1, q=2, r=p+q=3 → 到达第 3 阶有 3 种方法
  3. 返回结果:r=3

复杂度分析

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

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

相关推荐
ANYOLY15 小时前
分布式面试题库
分布式·面试·职场和发展
程序员小远15 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
程序员东岸17 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
程序员-King.17 小时前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
神仙别闹17 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法
Ayanami_Reii17 小时前
进阶数据结构应用-一个简单的整数问题2(线段树解法)
数据结构·算法·线段树·延迟标记
listhi52018 小时前
基于改进SET的时频分析MATLAB实现
开发语言·算法·matlab
Keep_Trying_Go19 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计