文章目录
前言
本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。
一、题目
1、原题链接
2、题目描述
二、个人思路整理
1、思路分析
dp[i][j]代表杨辉三角第i行第j列的元素值(下标均从0开始)。- 状态转移方程:
- 每一行的首尾两端均为1,即
dp[i][0]=1,dp[i][i]=1。 - 对于行内的中间元素(
0<j<i),其值等于上一行相邻两个元素之和,即dp[i][j]=dp[i-1][j-1]+dp[i-1][j]。
复杂度分析
- 时间复杂度: O ( numRows 2 ) O(\text{numRows}^2) O(numRows2),一共需要计算 1 + 2 + ⋯ + numRows = numRows ( numRows + 1 ) 2 1 + 2 + \dots + \text{numRows} = \frac{\text{numRows}(\text{numRows} + 1)}{2} 1+2+⋯+numRows=2numRows(numRows+1) 个数字。
- 空间复杂度: O ( 1 ) O(1) O(1)(返回值所需的存储空间除外)。
2、解题代码
cpp
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> dp(numRows); //开辟含numRows个空vector的dp数组
for(int i = 0; i < numRows; i++) {
dp[i].resize(i+1, 1); // 第i行有i+1个元素,先全部初始化为1
for (int j = 1; j < i ; j++) {
// 中间元素等于上一行相邻两数之和
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}
}
return dp;
}
};
三、知识风暴
vector赋值
vector<int> dp(n, val);:有参构造函数,分配n个元素的内存空间,并将每个元素都初始化为val(如果省略第二个参数(如vector<int> dp(n);),默认会用类型的默认值填充(对于int就是 0 0 0))。dp.resize(n, val):成员方法,用于调整一个已经存在的vector的大小(改变其size())。
- 行为规则:
- 当 n > 当前 size n > \text{当前 size} n>当前 size:数组扩容到 n n n,多出来的那些新元素会被赋值为
val(若省略val则为 0 0 0)。 - 当 n < 当前 size n < \text{当前 size} n<当前 size:数组截断到前 n n n 个元素,超出部分被直接丢弃。
- 当 n = = 当前 size n == \text{当前 size} n==当前 size:什么也不做,原有元素的值保持不变。
- 当 n > 当前 size n > \text{当前 size} n>当前 size:数组扩容到 n n n,多出来的那些新元素会被赋值为
vector<vector<int>> dp(n)会创建 n n n 个vector<int>,每个vector<int>调用其默认构造函数(当vector<int>被默认初始化时:默认构造函数vector<int>()产生的是一个size == 0的空动态数组)。

