力扣70. 爬楼梯
题目来源(力扣):
https://leetcode.cn/problems/climbing-stairs/description/
题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
基本思路:
假设一次只能走1个台阶,到达第n个台阶的方案实际上就是到达第n-1个台阶的方案,即dp[i]=dp[i-1]。
在到达第n-1个台阶之后,再多走一次(1步)就到底第n个台阶。
同理,一次只能走1~2个台阶,到达第n个台阶的方案实际上就是到达第n-1与n-2个台阶的方案的和,即dp[i]=dp[i-1]+dp[i-2]。
在到达第n-1个台阶之后,再多走一次(1步)就到达第n个台阶;在到达第n-2个台阶之后,再多走一次(2步)就到达第n个台阶。
以n=4为例,
dp[1]=1;
dp[2]=2;
dp[3]=dp[1]+dp[2]=3;
dp[4]=dp[2]+dp[3]=2+3=5;
补充,此时整个dp数组就是斐波那契数列 https://www.cnblogs.com/hb-computer/articles/18562880
代码实现:
class Solution
{
public:
int climbStairs(int n)
{
//0. 先处理特殊情况
if (n == 1)
return 1;
if (n == 2)
return 2;
// 1. 确定dp数组以及含义 dp[i]表示台阶为i时需要花费的步数
vector<int> dp(n + 1);
// 2. 确定递推方程
// dp[n]=dp[n-1]+dp[n-2]
// 3. dp数组初始化
// 最开始在第0台阶,到达第1台阶的方式只有1种(0->1),到达第2台阶的方式有2种(0->1->2;0->2)
dp[0] = 0, dp[1] = 1, dp[2] = 2;
// 4. 确定遍历顺序 :从前往后
for (int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
// 5. 打印(部分)dp数组以验证是否正确
// for(int i=1;i<dp.size();i++)
// cout<<dp[i]<<" ";
return dp[n];
}
};
时间复杂度
O(n)
浙公网安备 33010602011771号