leetcode 70爬楼梯

复制代码
class Solution {
public:
    int climbStairs(int n) {
        if(n <= 2) return n;

        vector<int> dp(n + 1);

        // dp[i]:到达第 i 个台阶有几种方法
        dp[1] = 1;
        dp[2] = 2;

        for(int i = 3; i <= n; i++){
            // 最后一步走1阶或2阶
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n];
    }
};

总结

这道题最重要的是理解:

复制代码
dp[i]

表示:

到达第 i 个台阶,一共有多少种方法。

到达第 i 阶,最后一步只有两种可能:

① 从第 i-1 阶走 1 步

复制代码
dp[i-1]

② 从第 i-2 阶走 2 步

复制代码
dp[i-2]

所以:

复制代码
dp[i] = dp[i-1] + dp[i-2];

为什么 dp[1] = 1,dp[2] = 2?

复制代码
第1阶:
1

只有一种。

复制代码
第2阶:
1 + 1
2

有两种。

所以:

复制代码
dp[1] = 1;
dp[2] = 2;

然后不断往后推:

复制代码
dp[1] = 1
dp[2] = 2
dp[3] = 3
dp[4] = 5
dp[5] = 8
...

你这次解决的两个易错点

① vector 大小

复制代码
vector<int> dp(n + 1);

因为需要访问:

复制代码
dp[n]

所以必须开 n + 1 个位置。


② n <= 2 的边界

复制代码
if(n <= 2) return n;

避免 n = 1 时还去访问:

复制代码
dp[2]

导致越界。


最后记住这个 DP 模板

复制代码
1. 定义 dp[i]:第 i 个状态代表什么
2. 找最后一步/最后一个状态怎么来的
3. 写状态转移方程
4. 初始化最前面的状态
5. 从前往后推
6. 返回 dp[n]

这道题就是最基础的线性 DP,核心公式:

复制代码
dp[i] = dp[i - 1] + dp[i - 2];

本质上就是斐波那契数列。

相关推荐
AiNightVision2 小时前
星光级 是什么?——星光级摄像机是什么?0.001Lux 照度门槛与选型真相
人工智能·算法·车载系统·自动驾驶·无人机·视频·智能硬件
若亦_2 小时前
排序>>选择排序
数据结构·算法·排序算法
重生之小比特2 小时前
【算法拾光】前缀和|一维前缀和 + 二维前缀和
数据结构·算法
文丑颜不良啊2 小时前
LeetCode1181~1200题目解析
java·leetcode
释厄6232 小时前
矢量词汇向下不向上公理即词汇归位定律——肤浅即表面
java·人工智能·算法·去中心化·1024程序员节
海绵宝宝转agent2 小时前
Leetcode100+面经
java·笔记·学习·算法·leetcode·深度优先
Shaoshing2 小时前
LeetCode100 283.移动零
java·数据结构·算法·leetcode
海绵宝宝转agent2 小时前
LeetCode100个人题解+java面经总结
java·开发语言·笔记·学习·算法
文丑颜不良啊2 小时前
LeetCode1201~1220题目解析
java·leetcode
文丑颜不良啊3 小时前
LeetCode1161~1180题目解析
java·leetcode