编程题目:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
- 输入: 3
输出: [1,3,3,1]
解法:
1.两次遍历
注意到对第 i+1 行的计算仅用到了第 i 行的数据,因此可以使用滚动数组的思想优化空间复杂度。
时间复杂度O(N^2)
空间复杂度O(N)
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> res, temp;
for (int i = 0; i <= rowIndex; i++)
{
temp.resize(rowIndex+1);
temp[0] = temp[i] = 1;
for (int j = 1; j < i; j++)
temp[j] = res[j-1] + res[j];
res = temp;
}
return res;
}
};
优化
倒着计算当前行,这样计算到第 i 项时,第 i−1 项仍然是上一行的值。
时间复杂度O(N^2)
空间复杂度O(1)
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> res(rowIndex+1);
res[0] = 1;
for (int i = 1; i <= rowIndex; i++)
{
for (int j = i; j > 0; j--)
res[j] += res[j-1];
}
return res;
}
};