LeetCode 面试必备100题:Climbing Stairs 爬楼梯的方法
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 面试必备100题:Climbing Stairs 爬楼梯的方法相关的知识,希望对你有一定的参考价值。
作者:Linux猿
简介:CSDN博客专家,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)
一、题意
爬一个楼梯,爬 n 步才能到达顶部。每次只能爬 1 步或 2 步,计算有多少种不同的方式到达顶部(1 <= n <= 45)。
二、测试样例
1. 样例一
输入: n = 2
输出: 2
有两种方法到达顶部:
(1)1 步 + 1 步;
(2)直接两步;
2. 样例二
输入:n = 3
输出:3
有三种方法到达顶部:
(1)1 步 + 1 步 + 1 步
(2)1 步 + 2 步
(3)2 步 + 1 步
三、解题思路
本题可以使用动态规划的思想,假设爬 n 阶楼梯需要 f[n] 种方法,那么,就有如下公式:
为什么是这样呢?
因为到达第 n 个阶必须从第 n-1 阶走一步或从第 n - 2 阶走两步到达,前面我们已经假设爬 n 阶楼梯需要 f[n] 种方法,那么爬 n-1 阶 和 爬 n-2 阶的方法数分别就是 f[n-1] 和 f[n-2],故上述公式成立。
代码实现有两个方式:递归和递推。
递归求解容易超时,因为不断递归容易栈溢出。递推的方式明显的节省了空间。
本题还可以延伸一下,改成可以取模的形式,比如:
求到达第 n 阶有多少种方法? n < 10^7(比如:结果对10^5 + 7 取余)。
这样难度就更大了,单纯使用 for 循环就不行了。当然打表的话应该还是可以的。最佳的方法是使用矩阵快速幂的方法,大家可以自行了解下,这里就不延伸了。
四、代码实现
class Solution {
public:
int climbStairs(int n) {
if(n <= 2) return n;
int first = 1, second = 2;
for(int i = 3; i <= n; ++i){
int tmp = first + second;
first = second;
second = tmp;
}
return second;
}
};
上述代码并没有使用 f[] 数组的形式,而是使用了两个变量 first 和 second 来模拟实现,因为有用的永远是前两个元素。
五、题目链接
关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)
以上是关于LeetCode 面试必备100题:Climbing Stairs 爬楼梯的方法的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode面试必备100题:3Sum 数组中查找三个和为零的数
LeetCode 面试必备100题:Best Time to Buy and Sell Stock II
LeetCode 面试必备100题:无重复字符的最长子串 Longest Substring Without Repeating Characters
LeetCode 面试必备100题:Best Time to Buy and Sell Stock 买卖股票的最佳时机