LeetCode 118. 杨辉三角 | C++ 数组模拟与动态规划题解
📌 题目描述
题目级别:简单
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
💡 解题思路:数组模拟 / 基础动态规划
生成杨辉三角的过程,本质上就是一个非常基础的动态规划(或递推)过程。我们可以将其看作是一个二维数组,只是每一行的长度在递增。
通过观察杨辉三角的排布规律,我们可以总结出两个核心的生成规则:
- 边界规则 :每一行的第一个元素和最后一个元素永远是
1。- 对应代码逻辑:当列索引
j == 0(首位)或者j == i(末位)时,该位置的值赋为1。
- 对应代码逻辑:当列索引
- 内部推导规则(状态转移方程) :除首尾元素外,内部的任何一个数字,都等于它正上方 的数字与左上方 的数字之和。
- 对应代码逻辑:
res[i][j] = res[i - 1][j - 1] + res[i - 1][j]。
- 对应代码逻辑:
图解推导过程
假设我们要计算第 3 行(索引为 i = 2)的中间元素(索引为 j = 1):
- 左上方元素:第 2 行(
i - 1 = 1)的第 1 个元素(j - 1 = 0),即res[1][0]。 - 右上方(正上方)元素:第 2 行(
i - 1 = 1)的第 2 个元素(j = 1),即res[1][1]。 - 得出:
res[2][1] = res[1][0] + res[1][1]。
💻 C++ 代码实现
cpp
class Solution {
public:
vector<vector<int>> generate(int numRows) {
// 初始化外层 vector,总共有 numRows 行
vector<vector<int>> res(numRows);
for (int i = 0; i < numRows; i++) {
// 动态分配当前行的空间,第 i 行有 i + 1 个元素
res[i].resize(i + 1);
// 遍历当前行的每一个位置
for (int j = 0; j <= i; j++) {
// 边界条件:每一行的第一个和最后一个元素固定为 1
if (j == 0 || j == i) {
res[i][j] = 1;
}
// 状态转移:中间元素 = 左上方元素 + 右上方元素
else {
res[i][j] = res[i - 1][j - 1] + res[i - 1][j];
}
}
}
return res;
}
};