作者:李磊g114826 | 来源:互联网 | 2024-12-23 16:05
给定行数numRows,生成帕斯卡三角形的前numRows行。例如,当numRows为5时,返回的结果应为:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]。
问题描述:
根据给定的行数 numRows,生成帕斯卡三角形(Pascal's Triangle)的前 numRows 行。
例如,如果 numRows = 5,则返回:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
中文解释:
给定行数 numRows,生成帕斯卡三角形的前 numRows 行。
例如,如果 numRows = 5,则返回:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
解决方案:
初次接触这道题时,可能会觉得有简便方法,但实际操作中需要按照定义逐步构建。帕斯卡三角形的构造规则如下:
- 第一行只有一个元素:1。
- 第二行有两个元素:1, 1。
- 从第三行开始,每一行的元素数量等于行号。每行的第一个和最后一个元素都是 1,中间的元素是上一行相邻两个元素之和。
具体实现可以通过以下步骤完成:
- 初始化一个空的结果列表 result 和一个临时列表 last 用于存储上一行的数据。
- 遍历从 1 到 numRows 的每一行,对于每一行:
- 创建一个新的行列表 row,并将第一个元素设为 1。
- 如果当前行大于 2,则根据上一行的数据填充中间元素。
- 将新生成的行添加到结果列表中,并更新 last 为当前行。
时间复杂度为 O(n²),其中 n 是行数。
1 class Solution {
2 public:
3 vectorint>> generate(int numRows) {
4 if( numRows <&#61; 0 ) {
5 return vectorint>>();
6 }
7
8 vectorint>> result;
9 vector<int> last &#61; {1};
10 for( int i &#61; 1; i <&#61; numRows; i&#43;&#43; ) {
11 vector<int> row &#61; {1};
12 if( i >&#61; 2 ) {
13 for( int j &#61; 1; j 1; j&#43;&#43; ) {
14 row.push_back(last[j-1] &#43; last[j]);
15 }
16 }
17 row.push_back(1 );
18 result.push_back(row);
19 last &#61; row;
20 }
21 return result;
22 }
23 };