给出一个索引k,返回杨辉三角形的第k行。

例如,给出k = 3,返回[1, 3, 3, 1]

注意:

你可以优化你的算法使之只使用O(k)的额外空间吗?

 

初始思路

首先来复习复习杨辉三角形的性质(来自wiki):

  1. 杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。
  2. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)行的数字个数为[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)个。
  3. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)行的第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)个数字为组合数[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)
  4. [LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)行数字和为[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)
  5. 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)行第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)个数字等于第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)行的第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)个数字与第[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)个数字的和)。这是因为有组合恒等式:[LeetCode 119] - 杨辉三角形II(Pascal's Triangle II)。可用此性质写出整个杨辉三角形。

看到第2条和5条是不是发现和 [LeetCode 120] - 三角形(Triangle) 中的最终算法有点像?没错,这里可以使用类似的方法得出杨辉三角形中第k行的数据,而且更简单:

  • 第1列和最后1列的数字永远为1
  • 其他列如性质5所述,为上一行纵坐标j-1和纵坐标j的点之和

最终得出的只是用O(k)额外空间的代码如下:

 1 class Solution {
 2     public:
 3         std::vector<int> getRow(int rowIndex)
 4         {
 5             std::vector<int> columnInfo(rowIndex + 1);
 6             
 7             columnInfo[0] = 1;
 8             
 9             if(rowIndex == 0)
10             {
11                 return columnInfo;
12             }
13             
14             columnInfo[1] = 1;
15             
16             for(int i = 1; i < rowIndex + 1; ++i)
17             {
18                 for(int j = i; j > 0; --j)
19                 {
20                     if(j == 0 || j == i)
21                     {
22                         columnInfo[j] = 1;
23                     }
24                     else
25                     {
26                         columnInfo[j] = columnInfo[j - 1] + columnInfo[j];
27                     }
28                 }
29             }
30             
31             return columnInfo;
32         }
33 };
getRow

相关文章: