LeetCode | 爬楼梯

2023-03-09 19:57:32 浏览数 (1)

题目

70. 爬楼梯 - 力扣(LeetCode)

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

示例 1:

代码语言:javascript复制
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶   1 阶
2. 2 阶

示例 2:

代码语言:javascript复制
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶   1 阶   1 阶
2. 1 阶   2 阶
3. 2 阶   1 阶

提示: 1 <= n <= 45

题解 其实就是 动态规划

将 本问题 分解为 多个 子问题, 爬上 第 n 阶楼梯的方法数量 等于以下 两 部分之和

  1. 爬上 n-1 阶楼梯的方法数量, 因为再爬1阶就能到第 n 阶
  2. 爬上 n-2 阶楼梯的方法数量, 因为再爬2阶就能到第 n 阶 于是可得 dpn = dpn−1 dpn−2 初始化

dp0 = 1

dp1 = 1

时间复杂度:

O(n)

代码语言:javascript复制
public class Solution {
    #region 方法2: 循环
    public int ClimbStairs(int n)
    {
        if (n <= 1)
        {
            return 1;
        }
        // 注意: 长度: n   1
        int[] arr = new int[n   1];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i < arr.Length; i  )
        {
            // arr[2] = arr[1]   arr[0]
            // arr[3] = arr[2]   arr[1]
            // arr[4] = arr[3]   arr[2]
            // ...
            // 在循环内最后一次: 再i  , 就会达到 Length, 从而不满足循环条件而退出
            // arr[n] = arr[n - 1]   arr[n -2]
            arr[i] = arr[i - 1]   arr[i - 2];
        }
        return arr[n];
    }
    #endregion
}

代码语言:javascript复制
public class Solution {
    #region 方法3: 循环 压缩优化
    /// <summary>
    /// dp[i] 只与 dp[i - 1] 和 dp[i - 2] 有关,没有必要存储所有计算过的 dp 项。用两个临时变量去存这两个状态就好
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public int ClimbStairs(int n)
    {
        int prev = 1, cur = 1;
        int temp;
        for (int i = 2; i < n   1; i  )
        {
            temp = cur; // 暂存上一次的 cur
            cur = prev   cur; // 当前的 cur = 上上次cur   上一次cur
            prev = temp; // prev 更新为 上一次 cur
        }

        return cur;
    }
    #endregion
}

Q&A 补充 参考 感谢帮助!

画解算法:70. 爬楼梯 - 爬楼梯 - 力扣(LeetCode)

本文作者: yiyun

  • 本文链接: https://cloud.tencent.com/developer/article/2237169
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

0 人点赞