这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
leetcode70-爬楼梯
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
解题思路分析
解法1
根据题目所描述的要求,我们需要在台阶上爬楼梯。每一步可以选择爬一层或爬两层。而想要得到的内容则为共有多少种方法可以到达楼顶。首先可以退一步进行思考,如果想要到楼顶,需要从哪一层爬上去。由于只能爬一层或两层,则很容易知道我们需要到达n-1层或n-2层,才能到达楼顶。因此爬到楼顶的方法则转化为求有多少种方法能到达n-1层以及到达n-2层。只需要将二者相加即可得到目标结果。因此,该问题可以很容易想到动态规划的解题方案,利用n-1和n-2求出n。因此也就得到了状态转移方程,f(n) = f(n-1)+f(n-2)。同样的,想要得到目标结果,则需要首先对0,1,2进行单独的计算。处于优化角度考虑,将dp数组采用单个变量进行存储,只需要记录前两个节点的数据即可,变量循环使用。至此,题目内容已经解题完毕。
public int climbStairs(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else if(n == 2){
return 2;
}
int[] list = new int[n + 1];
list[0] = 0;
list[1] = 1;
list[2] = 2;
for (int i = 3; i <= n; i++) {
list[i] = list[i-1] + list[i-2];
}
return list[n];
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。