爬楼梯 - LeetCode 热题 81

大家好!我是曾续缘😇

今天是《LeetCode 热题 100》系列

发车第 81 天

动态规划第 1 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

爬楼梯

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

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

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45
难度:❤️

解题方法

爬楼梯问题是一个经典的动态规划问题。我们可以使用动态规划的方法来解决这个问题。动态规划的基本思想是将原问题分解为子问题,然后求解子问题,最后将子问题的解组合得到原问题的解。

在爬楼梯问题中,我们可以将问题分解为以下几个子问题:

  1. 爬到第1阶楼梯有多少种方法?
  2. 爬到第2阶楼梯有多少种方法?
  3. 爬到第3阶楼梯有多少种方法?

    n. 爬到第n阶楼梯有多少种方法?

观察后发现,爬到第n阶楼梯的方法数等于爬到第n-1阶楼梯的方法数加上爬到第n-2阶楼梯的方法数。因为每次只能爬1阶或2阶,所以爬到第n阶楼梯只有两种选择:从第n-1阶爬1阶到达,或者从第n-2阶爬2阶到达。

根据这个规律,我们可以使用一个数组f来存储爬到每一阶楼梯的方法数。数组f的长度为n+2,其中f[0]表示爬到第0阶楼梯的方法数,f[1]表示爬到第1阶楼梯的方法数,以此类推,f[n]表示爬到第n阶楼梯的方法数。

接下来,我们需要初始化数组f,将f[0]设为1,表示爬到第0阶楼梯只有一种方法(即不爬)。然后,我们遍历数组f,从第1个元素开始,依次计算爬到每一阶楼梯的方法数。具体地,对于数组f中的每个元素f[i],我们将其值更新为f[i-1]f[i-2]的和,分别表示从第i-1阶楼梯爬1阶到达和从第i-2阶楼梯爬2阶到达的方法数之和。

最后,我们返回数组f中的最后一个元素f[n],即为爬到第n阶楼梯的方法数。

Code

public class Solution {
    public int climbStairs(int n) {
        // 创建一个长度为n+2的数组f,用于存储爬到每一阶楼梯的方法数
        int[] f = new int[n + 2];
        // 将数组f的所有元素初始化为0
        Arrays.fill(f, 0);
        // 将数组f的第一个元素设为1,表示爬到第0阶楼梯只有一种方法(即不爬)
        f[0] = 1;
        // 遍历数组f,从第1个元素开始,依次计算爬到每一阶楼梯的方法数
        for (int i = 0; i < n; i++) {
            // 将当前元素的值更新为前两个元素的和,分别表示从第i-1阶楼梯爬1阶到达和从第i-2阶楼梯爬2阶到达的方法数之和
            f[i + 1] += f[i];
            f[i + 2] += f[i];
        }
        // 返回数组f中的最后一个元素,即为爬到第n阶楼梯的方法数
        return f[n];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值