Skip to content

Commit f6da632

Browse files
committed
feat: add climb stairs dynamic programing
1 parent 4ee562e commit f6da632

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
39.6 KB
Binary file not shown.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
* @Author: Chacha
3+
* @Date: 2022-03-01 17:19:41
4+
* @Last Modified by: Chacha
5+
* @Last Modified time: 2022-03-02 10:23:13
6+
*/
7+
8+
/**
9+
* 来源:https://leetcode-cn.com/problems/climbing-stairs/
10+
*
11+
* 动态规划 - 爬楼梯
12+
*
13+
* 假设你正在爬楼梯。需要 n (1 <= n <= 45) 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
14+
*
15+
* 示例 1:
16+
* 输入:n = 2
17+
* 输出:2
18+
* 解释:有两种方法可以爬到楼顶。
19+
* 1. 1 阶 + 1 阶
20+
* 2. 2 阶
21+
*
22+
* 示例 2:
23+
* 输入:n = 3
24+
* 输出:3
25+
* 解释:有三种方法可以爬到楼顶。
26+
* 1. 1 阶 + 1 阶 + 1 阶
27+
* 2. 1 阶 + 2 阶
28+
* 3. 2 阶 + 1 阶
29+
*
30+
*/
31+
32+
#include <iostream>
33+
34+
using namespace std;
35+
36+
class Solution
37+
{
38+
private:
39+
/* data */
40+
public:
41+
int climbStairs(int n);
42+
};
43+
44+
/**
45+
* 题解:
46+
* 爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。那么第一层楼梯再跨两步就到第三层,第二层楼梯再跨一步就到第三层。
47+
* 所以到第三层楼梯的状态可以由第二层楼梯和到第一层楼梯状态推导出来。
48+
*
49+
* 动态规划五部曲:
50+
* 定义一个一维数组来记录不同楼层的状态
51+
* 1. 确定dp数组以及下标的含义
52+
* dp[i]: 爬到第i层楼,有dp[i]种方法
53+
* 2. 确定递推公式
54+
* 从dp[i]的定义可以看出,dp[i]可以有两个方向推出来。首先是dp[i-1], 上 i-1 层楼梯,有d[i-1]种方法,那么再一步跳一个台阶就是dp[i]。
55+
* 还有就是dp[i-2],上 i-2 层楼梯,有dp[i-2]种方法,那么再一步跳两个台阶就是dp[i]。所以 dp[i] = dp[i-1] + dp[i-2]。
56+
* 3. dp数组初始化
57+
* 不考虑dp[0]的始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。
58+
* 4. 确定遍历顺序
59+
* 从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的
60+
* 5. 推导dp数组
61+
*
62+
* 时间复杂度:O(n)
63+
* 空间复杂度:O(1)
64+
*
65+
*/
66+
int Solution::climbStairs(int n)
67+
{
68+
if (n < 2)
69+
return n;
70+
71+
int dp[3];
72+
73+
dp[1] = 1;
74+
dp[2] = 2;
75+
76+
for (int i = 3; i <= n; i++)
77+
{
78+
int sum = dp[1] + dp[2];
79+
dp[1] = dp[2];
80+
dp[2] = sum;
81+
}
82+
83+
return dp[2];
84+
};
85+
86+
int main(int argc, char const *argv[])
87+
{
88+
Solution s;
89+
90+
cout << "dp[2] = " << s.climbStairs(2) << endl;
91+
cout << "dp[3] = " << s.climbStairs(3) << endl;
92+
cout << "dp[4] = " << s.climbStairs(4) << endl;
93+
cout << "dp[5] = " << s.climbStairs(5) << endl;
94+
cout << "dp[6] = " << s.climbStairs(6) << endl;
95+
cout << "dp[7] = " << s.climbStairs(7) << endl;
96+
97+
return 0;
98+
}

0 commit comments

Comments
 (0)