【C++经典例题】杨辉三角问题

💓 博客主页:倔强的石头的CSDN主页****

📝Gitee主页:倔强的石头的gitee主页****

⏩ 文章专栏:C++经典例题

期待您的关注

目录

一、问题描述

二、解题思路

[解法 1 思路](#解法 1 思路)

[解法 2 思路](#解法 2 思路)

三、代码实现

[解法 1 代码](#解法 1 代码)

[解法 2 代码](#解法 2 代码)

四、总结


"杨辉三角" 问题是一道经典的算法题目,它不仅考验对数组操作的熟练程度,还需要深入理解杨辉三角的数学特性。

本文将详细介绍该问题的描述、解题思路以及两种不同的代码实现方案。

一、问题描述

给定一个非负整数 numRows,要求生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

例如,当 numRows = 5 时,生成的杨辉三角如下:

cpp 复制代码
[

[1],

[1,1],

[1,2,1],

[1,3,3,1],

[1,4,6,4,1]

]

杨辉三角只是在逻辑上想象为一个等腰三角形

在计算机中实际存储,其实是这样的:

二、解题思路

解法 1 思路

初始化结果数组

  • 首先创建一个二维向量 result,也就是vector<vector<int>>,它的大小为 numRows,这将用于存储杨辉三角的每一行。
  • 内层vector的大小根据行号 i 来确定,第 i 行有 i + 1 个元素。并且将每一行的所有元素初始化为 1,这是因为杨辉三角每一行的首尾元素都是 1

计算中间元素

  • 从第三行(索引为 2)开始,因为前两行已经全部初始化为 1,不需要额外计算。
  • 对于每一行的中间元素(索引 j 从 1 到该行元素个数减 2),其值等于上一行同一列的元素 resulti - 1j - 1 加上上一行前一列的元素 resulti - 1j。通过两层循环,外层循环控制行数,内层循环控制每行的元素位置,从而完成杨辉三角的生成。

解法 2 思路

处理边界情况

  • 首先首先创建一个二维向量 result,vector<vector<int>>,检查输入的 numRows 是否为 0,如果是,则直接返回空的 vectot<vector<int>> result ,因为不需要生成任何行。
  • 接着处理 numRows 为 1 的情况,将第一行 1 直接添加到 result 中并返回。

初始化前两行

  • 当 numRows 大于 1 时,先将第一行 1 和第二行 1, 1 添加到 result 中。

生成后续行

当numRows超过2时,才需要计算

  • 从第三行(索引为 2)开始生成。
  • 对于每一行,首先创建一个大小为 i + 1 的vector <int>row。
  • 明确每行的首元素 row0 和尾元素 rowi 都为 1。
  • 对于中间元素(索引 j 从 1 到 i - 1),其值同样通过上一行对应位置的元素相加得到,即 rowj = resulti - 1j - 1 + resulti - 1j。最后将生成的行 row 添加到 result 中

三、代码实现

解法 1 代码

cpp 复制代码
class Solution1 
{
    public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> result(numRows, vector<int>());

        for (int i = 0; i < numRows; ++i) // 每行确定数据个数,并全部初始化为1
        {
            result[i].resize(i + 1, 1);
        }

        for (int i = 2; i < numRows; ++i) // 依次计算每行除首尾元素外的值,前两行不需要计算
        {
            for (int j = 1; j < result[i].size() - 1; ++j) 
            {
                result[i][j] = result[i - 1][j - 1] + result[i - 1][j];
            }
        }

        return result;
    }
};

解法 2 代码

cpp 复制代码
class Solution2 
{
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> result;
        if (numRows == 0) return result;

        // 处理第一行
        result.push_back({ 1 });
        if (numRows == 1) return result;

        // 处理第二行
        result.push_back({ 1, 1 });
       

        // 从第三行开始生成
        for (int i = 2; i < numRows; ++i) 
        {
            vector<int> row(i + 1);
            row[0] = 1; // 首元素为1
            row[i] = 1; // 尾元素为1

            // 计算中间元素
            for (int j = 1; j < i; ++j) 
            {
                row[j] = result[i - 1][j - 1] + result[i - 1][j];
            }
    
            result.push_back(row);
        }

    return result;
    }
};

四、总结

这两种解法都通过对杨辉三角特性的理解,利用循环和数组操作来生成所需的杨辉三角。

解法 1 相对更简洁,通过一次初始化所有行并填充首尾元素为 1,再集中计算中间元素。

解法 2 则更具逻辑性,逐步处理每一行,先处理边界情况,再依次生成后续行。

两种解法在时间复杂度和空间复杂度上基本相同,时间复杂度为 O(numRows^2)),因为需要遍历杨辉三角的每一个元素;

空间复杂度同样为 (O(numRows^2)),用于存储生成的杨辉三角。

通过对这道题目的深入分析和实现,能够有效提升对数组操作和算法设计的能力。

相关推荐
徐小夕1 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei1 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld2 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi83 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang4 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby5 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠6 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力6 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly6 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1236 小时前
SolidWorks草图转三维DWG技巧
算法