118. 杨辉三角
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> result(numRows);
result[0].push_back(1);
for(int i=1;i<numRows;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0) result[i].push_back(result[i-1][j]);
else if(j==i) result[i].push_back(result[i-1][j-1]);
else{
result[i].push_back(result[i-1][j-1]+result[i-1][j]);
}
}
}
return result;
}
};
一开始没给vector设定空间。当执行 result[0].push_back(1);
时,result
还没有任何元素,因此访问 result[0]
会导致越界访问并引发错误。
?不是说vecto能动态增加? 因为你这里result[0]不存在啊哥们!
vector
确实可以动态增长,但在执行 result[0].push_back(1);
时,如果 result
是空的,result[0]
的访问会导致越界错误,因为此时 result
还没有任何元素。
可以用以下方式:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> result;
if (numRows == 0) return result;
// 先添加第一行
result.push_back({1});
for (int i = 1; i < numRows; i++) {
vector<int> row(i + 1, 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;
}
};
也可以这样:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
// 创建一个二维 vector,并初始化其大小为 numRows
vector<vector<int>> result(numRows);
for(int i = 0; i < numRows; i++) {
// 将每一行的大小初始化为 i+1,并将第一个元素设为 1
result[i].resize(i + 1);
result[i][0] = 1;
result[i][i] = 1;
// 从第二个元素到倒数第二个元素进行填充
for(int j = 1; j < i; j++) {
result[i][j] = result[i-1][j-1] + result[i-1][j];
}
}
return result;
}
};
why为什么 vector<vector<int>> result(numRows);这样就可以了?
vector<vector<int>> result(numRows);
这种写法可以工作是因为它在初始化时为result
分配了numRows
个默认构造的vector<int>
元素。这意味着在执行result[0].push_back(1);
时,result
中已经有numRows
个空的vector<int>
,所以不会发生越界错误。