目录
“杨辉三角” 问题是一道经典的算法题目,它不仅考验对数组操作的熟练程度,还需要深入理解杨辉三角的数学特性。
本文将详细介绍该问题的描述、解题思路以及两种不同的代码实现方案。
给定一个非负整数 numRows,要求生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。

例如,当 numRows = 5 时,生成的杨辉三角如下:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
杨辉三角只是在逻辑上想象为一个等腰三角形

在计算机中实际存储,其实是这样的:

初始化结果数组:
计算中间元素:
处理边界情况:
初始化前两行:
生成后续行:
(当numRows超过2时,才需要计算)
class Solution1
{
public:
vector<vector<int>> generate(int numRows)
{
vector<vector<int>> result(numRows, vector<int>());
for (int i = 0; i < numRows; ++i) // 每行确定数据个数,并全部初始化为1
{
result[i].resize(i + 1, 1);
}
for (int i = 2; i < numRows; ++i) // 依次计算每行除首尾元素外的值,前两行不需要计算
{
for (int j = 1; j < result[i].size() - 1; ++j)
{
result[i][j] = result[i - 1][j - 1] + result[i - 1][j];
}
}
return result;
}
};
class Solution2
{
public:
vector<vector<int>> generate(int numRows)
{
vector<vector<int>> result;
if (numRows == 0) return result;
// 处理第一行
result.push_back({ 1 });
if (numRows == 1) return result;
// 处理第二行
result.push_back({ 1, 1 });
// 从第三行开始生成
for (int i = 2; i < numRows; ++i)
{
vector<int> row(i + 1);
row[0] = 1; // 首元素为1
row[i] = 1; // 尾元素为1
// 计算中间元素
for (int j = 1; j < i; ++j)
{
row[j] = result[i - 1][j - 1] + result[i - 1][j];
}
result.push_back(row);
}
return result;
}
};
这两种解法都通过对杨辉三角特性的理解,利用循环和数组操作来生成所需的杨辉三角。
解法 1 相对更简洁,通过一次初始化所有行并填充首尾元素为 1,再集中计算中间元素。
解法 2 则更具逻辑性,逐步处理每一行,先处理边界情况,再依次生成后续行。
两种解法在时间复杂度和空间复杂度上基本相同,时间复杂度为 O(numRows^2)),因为需要遍历杨辉三角的每一个元素;
空间复杂度同样为 (O(numRows^2)),用于存储生成的杨辉三角。
通过对这道题目的深入分析和实现,能够有效提升对数组操作和算法设计的能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。