给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
分析:题目中要求用O(k)的空间,要把原来二维的vector压缩到一维,通过观察规律可以发现,第n行就有n个元素,且行首行尾均为1,中间的n-2项进行迭代,可以不停的更新当前的一维数组,但要注意计算的中间结果按层一次性更新而不是算一个更新一个,保证后面的计算用到的数是上一行的,代码如下
public:
vector<int> getRow(int rowIndex) {
vector<int> v(rowIndex + 1);
for(int i = 0; i <= rowIndex; i++){
v[i] = 1;
}
// 迭代rowIndex次
if(rowIndex < 2) return v;
// i = 2对应杨辉三角的第三层开始
for(int i = 2; i <= rowIndex; i++){
// 构造一个临时vector存下一层的计算结果,算完一层的一次性赋值,因为v是一维的,要保证计算下一层的值不能是新的,update的方式是lazy的
vector<int> tempV(i - 1); // 迭代到第几层,就需要存i - 1个中间结果,因为0和i这两个位置的元素始终为1
for(int j = 1; j <= i - 1; j++){
tempV[j - 1] = v[j - 1] + v[j];
}
for(int j1 = 1; j1 <= i - 1; j1++){
v[j1] = tempV[j1 - 1];
}
}
return v;
}