原题地址(简单)

方法1—直接法(递推)

思路

直接根据题意做,不过不如官方写的代码好。

代码

我的:

  1. class Solution {
  2. public:
  3. vector<int> getRow(int rowIndex) {
  4. if(rowIndex == 0) return {1};
  5. vector<int> v;
  6. v.push_back(1);
  7. v.push_back(1);
  8. for(int i=0; i<rowIndex - 1; i++) {
  9. for(int j = 0; j < v.size() - 1; j++) {
  10. v[j] += v[j+1];
  11. }
  12. v.insert(v.begin(), 1);
  13. }
  14. return v;
  15. }
  16. };

官方代码如下:

  1. class Solution {
  2. public:
  3. vector<int> getRow(int rowIndex) {
  4. vector<int> row(rowIndex + 1);
  5. row[0] = 1;
  6. for (int i = 1; i <= rowIndex; ++i) {
  7. for (int j = i; j > 0; --j) {
  8. row[j] += row[j - 1];
  9. }
  10. }
  11. return row;
  12. }
  13. };

时空复杂度

时间

119. 杨辉三角 II - 图1

空间

119. 杨辉三角 II - 图2(不考虑返回值所占用空间)

方法2—线性递推

思路

由组合数公式 119. 杨辉三角 II - 图3,可以得到同一行的相邻组合数的关系119. 杨辉三角 II - 图4。由于119. 杨辉三角 II - 图5,利用上述公式我们可以在线性时间计算出第 nn 行的所有组合数。

代码

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> row(rowIndex + 1);
        row[0] = 1;
        for (int i = 1; i <= rowIndex; ++i) {
            row[i] = 1LL * row[i - 1] * (rowIndex - i + 1) / i;   // 1LL表示long long类型
        }
        return row;
    }
};

时空复杂度

时间119. 杨辉三角 II - 图6 空间119. 杨辉三角 II - 图7