[LeetCode]118. Pascal's Triangle 解题报告(C++)

[LeetCode]118. Pascal’s Triangle 解题报告(C++)

题目描述

Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle.

In Pascal’s triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 5
Output:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

题目大意

  • 给你一行数 numRows 让你生成 帕斯卡三角形.
  • 注: 索引号从 0 开始.

解题思路

方法1:

  • 根据杨辉三角的性质.
  • 观测可得:
  • res (i,j) = res (i-1, j-1) + res (i-1,j)
  • 特别注意 j==0 和 j== res[i].size-1 时,值都为 1

代码实现:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {

        vector<vector<int>> res;
        res.resize(numRows);
        for (int i = 0; i < numRows; i++) {
            res[i].resize(i + 1);
        }

        if (numRows <1) {
            return{};
        }

        res[0][0] = 1;
        for (int i = 1; i < numRows; i++) {
            for (int j = 0; j < res[i].size(); j++) {
                if (j == 0 || j == res[i].size() - 1) {
                    res[i][j] = 1;
                }
                else {
                    if (j - 1 >= 0) {
                        res[i][j] = res[i - 1][j] + res[i - 1][j - 1];
                    }
                }
            }
        }

        return res;
    }
};

[LeetCode] 解题报告(C++)

题目描述

Given a non-negative index k where k ≤ 33, return the *k*th index row of the Pascal’s triangle.

Note that the row index starts from 0.

img
In Pascal’s triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 3
Output: [1,3,3,1]

Follow up:

Could you optimize your algorithm to use only O(k) extra space?

题目大意

  • 给定一个非零的索引 k. 返回k-th index 行的杨辉三角.
  • 只用 O(k)的额外空间

解题思路

方法1:

  • 通过杨辉三角的性质. a(i,j) = a(i-1,j-1) + a(i-1,j);
  • 逐行构造.. 循环得到i-th row的.

代码实现:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        vector<int> out;
        if (rowIndex < 0) return out;
        // 索引i对应有i+1个元素.
        out.assign(rowIndex + 1, 0); // 初值为0.
        for (int i = 0; i <= rowIndex; ++i) {
            if (i == 0) {
                out[0] = 1;
                continue;
            }
            for (int j = rowIndex; j >= 1; --j) {
                out[j] = out[j] + out[j - 1];
            }
        }
        return out;
    }
};

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/81411424