[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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值