本文主要是介绍爬楼梯 - LeetCode 热题 81,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
大家好!我是曾续缘😇
今天是《LeetCode 热题 100》系列
发车第 81 天
动态规划第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
爬楼梯 假设你正在爬楼梯。需要
n
阶你才能到达楼顶。每次你可以爬
1
或2
个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 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阶楼梯有多少种方法?
- 爬到第2阶楼梯有多少种方法?
- 爬到第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的所有元素初始化为0Arrays.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];}
}
这篇关于爬楼梯 - LeetCode 热题 81的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!