Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
解法:对于每一行我们知道如果从前往后扫,第i个元素的值等于上一行的res[i]+res[i+1],可以看到数据是往前看的,如果我们只用一行空间,那么需要的数据就会被覆盖掉(计算n+1行第i+1个元素时,已经更新了第i个元素为第n+1行的第i个元素,而不是需要的第n行的第i个元素)。所以这里采取的方法是从后往前扫,这样每次需要的数据就是res[i]+res[i-1],我们需要的数据不会被覆盖,因为需要的res[i]只在当前步用,下一步就不需要了。这个技巧在动态规划省空间时也经常使用,主要就是看我们需要的数据是原来的数据还是新的数据来决定我们遍历的方向。时间复杂度还是O(n^2),而空间这里是O(k)来存储结果,仍然不需要额外空间。
class Solution { public: vector<int> getRow(int rowIndex) { vector<int> row; if (rowIndex < 0) return row; row.assign(rowIndex + 1, 0); for (int i = 0; i <= rowIndex; ++i) { if (i == 0) { row[0] = 1; continue; } for (int j = rowIndex; j >= 1; --j) row[j] = row[j] + row[j - 1]; } return row; } };