题目
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行
输入: 3
输出: [1,3,3,1]
来源:https://leetcode-cn.com/problems/pascals-triangle-ii/
解答
方法一:
因为已经做过一个杨辉三角的题目所以这个题目是没啥难度的。但是题目在进阶的说明里边说要使用 O(k)的空间复杂度,这个确实需要思考一下。
分析如下:
- k行 有 k + 1 个元素
- 每行元素的计算方法和上个问题是一样的
- 重点是下一行元素的计算依赖上一行
- 每一行数据都是对称的
- 每行需要计算的元素个数是 rowIndex - 1 (两边的1排除掉)
问题就变成了如何计算下一行的时候不需要分配新的空间,而且下一行数据的生成不会覆盖掉计算下一个元素需要的上一行的元素。
试想一下如果我们把元素放置的时候是从左到右的,计算的也是从左到右那么是避免不了要覆盖掉。因此在计算的时候可以这么做,读取元素的时候从右往左读,计算完成覆盖的时候从左往右覆盖,这样就不会影响后边元素的计算。
class Solution {
public:
vector<int> getRow(int rowIndex) {
///第n行有n个元素 行号是 rowIndex + 1
vector<int> res(rowIndex + 1, 1);
if (rowIndex == 0 || rowIndex == 1) {
return res;
}
///从第二行开始计算
//由于数据是对称的,每一行读取数据的时候都从右往左读
for (int i = 2; i <= rowIndex; i++) {
//每行要计算 i - 1个元素
for(int j = 0; j < i - 1; j++) {
// 找到第一个需要计算的元素的未知
int start = rowIndex - (i - 1) + j;
res[start] = res[start] + res[start + 1];
}
}
return res;
}
};