leetcode118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
蓝桥杯有个类似的题目,我曾写过题解。
题目分析
杨辉三角是一个经典的数学问题,每一行的第一个和最后一个数字都是1,其他位置的数字是它上方和左上方数字之和。这个问题可以通过动态规划的方式来解决。
算法步骤
- 初始化结果数组
res
和临时数组t
。 - 特殊处理第一行,将
1
加入t
,然后将t
加入res
。 - 如果
numRows
为1,直接返回res
。 - 初始化二维数组
nums
用于记录中间结果,大小为 40x40(根据题目需求设定)。 - 使用双重循环遍历每一行,计算当前行的数值:
- 对于每一行的第一个和最后一个数字,直接设置为1。
- 对于其他位置的数字,计算方式为
nums[i-1][j-1] + nums[i-1][j]
。
- 将计算结果存入
res
。
算法流程
具体代码
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> res;
vector<int> t;
t.push_back(1);
res.push_back(t);
if(numRows==1) return res;
int nums[40][40]={0};
nums[1][1]=1;
for(int i=2;i<=numRows;i++)
{
vector<int> temp;
temp.push_back(1);
nums[i][1]=1;
for(int j=2;j<=i-1;j++) //i=4
{
int sum=nums[i-1][j-1]+nums[i-1][j];
temp.push_back(sum);
nums[i][j]=sum;
}
temp.push_back(1);
nums[i][i]=1;
res.push_back(temp);
}
return res;
}
};
算法分析
- 时间复杂度: O(numRows^2),因为需要计算每一行的数值。
- 空间复杂度: O(numRows^2),因为需要存储每一行的数值。
- 易错点: 在计算每一行的数值时,需要注意边界条件,即每一行的第一个和最后一个数字都是1。
相似题目
题目 | 链接 |
---|---|
118. 杨辉三角 | https://leetcode.cn/problems/pascals-triangle/ |
119. 杨辉三角 II | https://leetcode.cn/problems/pascals-triangle-ii/ |
剑指 Offer 47. 礼物的最大价值 | https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/ |