1 题目
题目:爬楼梯(Climbing Stairs)
描述:假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,爬到顶部的方法有多少种?
lintcode题号——111,难度——easy
样例1:
输入:n = 3
输出:3
解释:
1, 1, 1
1, 2
2, 1
共3种
样例2:
输入:n = 1
输出:1
解释:只有一种方案
2 解决方案
2.1 思路
使用动态规划的方式解,将状态定义为表示走到当前台阶的方式种数,则走到当前台阶的方式等于走到上一阶的方式加上走到上上一阶的方式之和,理清动态规划的四要素即可解出。
2.2 时间复杂度
每个节点都需要计算一次,时间复杂度为O(n)。
2.3 空间复杂度
使用了容量为n的数组,空间复杂度为O(n)。
3 源码
细节:
- 动态规划的四要素:状态、方程、初始化、答案。(四要素在之前的题目数字三角形1中有详细介绍)
- 状态:用
dp[i]
表示从开头走到第i阶的方法种数。(注意dp的容量需要定义为n + 1) - 方程:
dp[i] = dp[i - 1] + dp[i - 2]
,走到第i阶的方式种数 = 走到第i-1阶的方式 + 走到第i-2阶的方式。 - 初始化:
dp[0] = 1, dp[1] = 1
,走到第0阶只有一种方式,走到第1阶也只有一种方式。 - 答案:走到最后一阶的方式种数,即
dp[max]
。
C++版本:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
if (n == 0)
{
return 0;
}
// 状态:dp[i]表示从开头走到第i阶的方法种数
vector<int> dp(n + 1);
// 初始化:走到第0阶只有一种方式,走到第1阶也只有一种方式
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i < dp.size(); i++)
{
// 方程:走到第i阶的方式种数 = 走到第i-1阶的方式 + 走到第i-2阶的方式
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[dp.size() - 1]; // 答案:走到最后一阶的方式种数
}
数字三角形:https://blog.youkuaiyun.com/SeeDoubleU/article/details/124678103 ↩︎