leetcode-70.爬楼梯
动态规划(dp)
题目详情
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路:
斐波那契数列题。定义一个数组 dp,dp[i] 表示走到第 i 阶的方法数。因为我们每次可以走一步或者两步,所以第 i 阶可以从第 i-1 或 i-2 阶到达。换句话说,走到第 i 阶的方法数即为走到第 i-1 阶的方法数加上走到第 i-2 阶的方法数。这样我们就得到了状态转移方程dp[i] = dp[i-1] + dp[i-2]。注意边界条件的处理。
我的代码:
class Solution
{
public:
int climbStairs(int n)
{
if (n <= 2) return n;
vector<int> dp(n+1, 1);
for (int i = 2; i <= n; ++i)
{
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
可以看出,我们利用了vector存储了各个状态,但是状态只有1和2两种,显然O(n)空间复杂度太过繁杂,我们可以用两个变量来存储状态,从而得到下面代码:
class Solution
{
public:
int climbStairs(int n)
{
if (n <= 2) return n;
int pre2 = 1, pre1 = 2, cur; //pre2 pre1 cur实质就是dp[i-2] dp[i-1] dp[i]
for (int i = 2; i < n; ++i) //注意这里变为 < 号了,因为如果是 = 号,最后
{ //return的cur就会多计算一次
cur = pre1 + pre2;
pre2 = pre1;
pre1 = cur;
}
return cur;
}
};
涉及知识点:
1.动态规划(dp)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?