输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> YangAngle(numRows, vector<int>()); // 定义5行,每行的大小为0
for (int i = 0; i < numRows; i++) {
YangAngle[i].resize(i + 1); // 确定每行个数
YangAngle[i][0] = 1; // 1,先确定边界值
YangAngle[i][i] = 1;
}
for (int i = 2; i < numRows; i++) { //2,确定中间值,从第i = 2行开始,中间数由左上和右上相加得到。
for (int j = 1; j < YangAngle[i].size() - 1; j++) { // 列的范围[1,YangAngle[i].size()-1)
YangAngle[i][j] = YangAngle[i - 1][j - 1] + YangAngle[i - 1][j];
}
}
return YangAngle;
}
};
问题2:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
输入: 3
输出: [1,3,3,1]
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> matrix(rowIndex+1,0);
matrix[0]=1;
for(int i = 1; i<=rowIndex; i++)
{
for(int j =i; j>0; j--)
{
matrix[j]=matrix[j-1]+matrix[j];
}
}
return matrix;
}
};
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
解题思路:第行的第
个数字为组合数
。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> yanghui_rowIndex(rowIndex+1);
int up=rowIndex,down=1;
yanghui_rowIndex[0]=1;
if(rowIndex==0)
return yanghui_rowIndex;
for(int i=1;i<rowIndex;i++)
{
long long temp=(long long)(yanghui_rowIndex[i-1])*up/down;
yanghui_rowIndex[i]=int(temp);
up--;down++;
}
yanghui_rowIndex[rowIndex]=1;
return yanghui_rowIndex;
}
};