1.题目链接:

118. 杨辉三角 - 力扣(LeetCode)

2.题目描述:

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

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

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

提示:

1 <= numRows <= 30

3.解题思路:

这段代码采用了动态规划的思路,通过构建二维数组来生成杨辉三角。首先,创建一个大小为 numRows 的二维数组 res,用来存储每一行的数字。在每一行的开始,调整每一行的大小为 i+1(其中 i 是行号),并将每一行的第一个和最后一个元素设置为 1,这是杨辉三角的边界条件。接着,从第三行开始,通过嵌套的循环填充每行的内部元素。每个内部元素的值等于上一行相邻两个元素之和,即 res[i][j] = res[i-1][j-1] + res[i-1][j]。这种方式逐步计算出每行的所有元素,最终生成完整的杨辉三角,并返回整个数组。

数学原理:组合恒等式 C(n,k)=C(n−1,k−1)+C(n−1,k)

4.题解代码:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> res(numRows);// 创建一个二维 vector,大小为 numRows,表示杨辉三角的行数for (int i = 0; i < res.size(); i++) // 遍历每一行{res[i].resize(i + 1, 0);// 调整每一行的大小为 i+1,并初始化所有元素为 0vres[i][0] = res[i][i] = 1;// 将每一行的第一个元素和最后一个元素设置为 1// 这是杨辉三角的边界条件:每行的第一个和最后一个数都是 1}for (int i = 2; i < res.size(); i++) //从第三行开始填充杨辉三角的内部元素{// 填充每行的内部元素,由上面两行的相邻元素相加得到for (int j = 1; j < i; j++){res[i][j] = res[i - 1][j - 1] + res[i - 1][j];// 当前元素等于上一行的相邻两个元素之和}}return res;}
};

5.示例演算:

当numrows = 4时

步骤操作结果
初始化创建4行空vector[ ], [ ], [ ], [ ]
边界设置设置首尾为1[1], [1,1], [1, ,1], [1, , ,1]
计算第2行res[2][1]=res[1][0]+res[1][1][1], [1,1], [1,2,1], [1, , ,1]
计算第3行res[3][1]=res[2][0]+res[2][1]
res[3][2]=res[2][1]+res[2][2]
[1], [1,1], [1,2,1], [1,3,3,1]

6.复杂度计算:

时间复杂度:其中n为行数。需填充n(n+1)/2​个元素,故时间复杂度为O(n^2)

空间复杂度:用了一个二维 vector 数组 res 来存储整个杨辉三角,故空间复杂度为O(n^2)

7.拓展:

递归解法:

class Solution {
public:vector<vector<int>> generate(int numRows) {if (numRows == 1) return {{1}};vector<vector<int>> prev = generate(numRows - 1);vector<int> newRow(numRows, 1);for (int j = 1; j < numRows - 1; j++) {newRow[j] = prev.back()[j - 1] + prev.back()[j];}prev.push_back(newRow);return prev;}
};

 时间复杂度:O(n^2)

 空间复杂度:O(n^2)

数学解法:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> res;for (int i = 0; i < numRows; i++) {vector<int> row;for (int j = 0; j <= i; j++) {row.push_back(combination(i, j)); // 计算组合数C(i,j)}res.push_back(row);}return res;}private:int combination(int n, int k) {long res = 1; // 避免乘法溢出for (int i = 1; i <= k; i++) {res = res * (n - i + 1) / i; // 递推公式}return (int)res;}
};

 时间复杂度:O(n^3)

 空间复杂度:O(n^2)

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/bicheng/86010.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86010.shtml
    英文地址,请注明出处:http://en.pswp.cn/bicheng/86010.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    【MATLAB代码】制导方法介绍与例程——追踪法,适用于二维平面,目标是移动的|附完整源代码

    追踪法(追踪导引法)是一种常见的导弹导引方式,其基本原理是保持导弹的速度矢量始终指向目标。在追踪法中,导弹的加速度可以表示为指向目标的加速度。 本文给出二维平面下,移动目标的追踪法导引的介绍、公式与matlab例程 订阅专栏后,可以直接查看完整源代码 文章目录 运行…

    小白的进阶之路系列之十八----人工智能从初步到精通pytorch综合运用的讲解第十一部分

    从零开始的NLP:使用序列到序列网络和注意力机制进行翻译 我们将编写自己的类和函数来预处理数据以完成我们的 NLP 建模任务。 在这个项目中,我们将训练一个神经网络将法语翻译成英语。 [KEY: > input, = target, < output]> il est en train de peindre un table…

    SSL安全证书:数字时代的网络安全基石

    SSL安全证书&#xff1a;数字时代的网络安全基石 在当今数字化浪潮中&#xff0c;网络通信安全已成为个人、企业和组织不可忽视的核心议题。SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09;安全证书作为保障数据传输安全的关键技术&#xff0c;通过加…

    LLM-201: OpenHands与LLM交互链路分析

    一、核心交互链路架构 #mermaid-svg-ZBqCSQk1PPDkIXNx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-icon{fill:#552222;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-text{fill:#552222;strok…

    【项目】仿muduo库one thread one loop式并发服务器SERVER模块(下)

    &#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 |&#x1f5c3;️ mysql 项目文章&#xff1a; 仿muduo库one thread one loop式并发服务器…

    数据库索引结构 B 树、B + 树与哈希索引在不同数据查询场景下的适用性分析

    一、数据库索引结构B树 树概述 树是一种多路平衡查找树&#xff0c;广泛应用于数据库和文件系统中。B树的节点可以存储多个数据元素&#xff0c;并且保持树的平衡&#xff0c;以提高查询效率。 适用性分析 在数据量较大&#xff0c;范围查找较多的场景下&#xff0c;B树的查询效…

    Linux进程间通信——信号

    1.信号的介绍 信号( Signal )是 Unix, 类Unix以及其他POSIX兼容的操作系统中进程间通信的一种有限制的手段。 1&#xff09;信号是在软件层面上对中断机制的一种模拟&#xff0c;是一种异步通信方式。2&#xff09;信号可以直接进行用户空间进程和内核进程之间的交互&#xff…

    Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)

    ByteMD Markdown编辑器详细解释&修改编辑器默认样式&#xff08;高度300px) AST树详解 [ByteMD 插件系统详解(https://blog.csdn.net/m0_55049655/article/details/148811248?spm1001.2014.3001.5501) Sevelet编写的Bytemd如何适配到React中 ⚡️1️⃣ 背景概述 Byte…

    《Redis》事务

    文章目录 Redis中的原子性Redis的事物和MySQL事务的区别Redis实现事务什么场景下&#xff0c;会使用事务? Redis事务相关命令watch命令的实现原理 总结 Redis中的原子性 Redis的原子性不同于MySQL的原子性。 Redis的事物和MySQL事务的区别 但是注意体会Redis的事务和MySQL…

    Elasticsearch Kibana (一)

    一、官方文档 elasticsearch官网&#xff1a;elasticsearch官网 elasticsearch源码&#xff1a;elasticsearch源码 ik分词器&#xff1a; ik分词器 ik分词器下载&#xff1a;ik分词器下载 elasticsearch 版本选择&#xff1a;elasticsearch 版本选择 官方推荐Elasticsearch和j…

    [linux] Ubuntu 24软件下载和安装汇总(自用)

    经常重装系统&#xff0c;备份下&#xff0c;有用的也可以参考。 安装图形界面 apt install ubuntu-desktop systemctl set-default graphical.target reboot 安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt insta…

    分布变化的模仿学习算法

    与传统监督学习不同,直接模仿学习在不同时刻所面临的数据分布可能不同.试设计一个考虑不同时刻数据分布变化的模仿学习算法 import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from…

    arm-none-eabi-ld: cannot find -lm

    arm-none-eabi-ld -Tuser/hc32l13x.lds -o grbl_hc32l13x.elf user/interrupts_hc32l13x.o user/system_hc32l13x.o user/main.o user/startup_hc32l13x.o -lm -Mapgrbl_hc32l13x.map arm-none-eabi-ld: cannot find -lm makefile:33: recipe for target link failed 改为在gcc…

    【Python办公】Excel文件批量样式修改器

    目录 专栏导读1. 背景介绍2. 项目概述3. 库的安装4. 核心架构设计① 类结构设计② 数据模型1) 文件管理2) 样式配置5. 界面设计与实现① 布局结构② 动态组件生成6. 核心功能实现① 文件选择与管理② 颜色选择功能③ Excel文件处理核心逻辑完整代码结尾专栏导读 🌸 欢迎来到P…

    QT的一些介绍

    //虽然下面一行代码进行widget和ui的窗口关联&#xff0c;但是如果发生窗口大小变化的时候&#xff0c;里面的布局不会随之变化ui->setupUi(this);//通过下面这行代码进行显示说明&#xff0c;让窗口变化时&#xff0c;布局及其子控件随之变化this->setLayout(ui->ver…

    RISC-V向量扩展与GPU协处理:开源加速器设计新范式——对比NVDLA与香山架构的指令集融合方案

    点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠 当开源指令集遇上异构计算&#xff0c;RISC-V向量扩展&#xff08;RVV&#xff09;正重塑加速…

    自动恢复网络路由配置的安全脚本说明

    背景 两个文章 看了就明白 Ubuntu 多网卡路由配置笔记&#xff08;内网 外网同时通 可能有问题&#xff0c;以防万一可以按照个来恢复 sudo ip route replace 192.168.1.0/24 dev eno8403 proto kernel scope link src <你的IP>或者恢复脚本! 如下 误操作路由时&…

    创建 Vue 3.0 项目的两种方法对比:npm init vue@latest vs npm init vite@latest

    创建 Vue 3.0 项目的两种方法对比&#xff1a;npm init vuelatest vs npm init vitelatest Vue 3.0 作为当前主流的前端框架&#xff0c;官方提供了多种项目创建方式。本文将详细介绍两种最常用的创建方法&#xff1a;Vue CLI 方式 (npm init vuelatest) 和 Vite 方式 (npm in…

    Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析

    Java求职者面试指南&#xff1a;Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析 面试官与程序员JY的三轮提问 第一轮&#xff1a;基础概念问题 1. 请解释一下Spring框架的核心容器是什么&#xff1f;它有哪些主要功能&#xff1f; JY回答&#xff1a;Spring框架的…

    【修复MySQL 主从Last_Errno:1051报错的几种解决方案】

    当MySQL主从集群遇到Last_Errno:1051报错后不要着急&#xff0c;主要有三种解决方案&#xff1a; 方案1: 使用GTID场景&#xff1a; mysql> STOP SLAVE;(2)设置事务号&#xff0c;事务号从Retrieved_Gtid_Set获取 在session里设置gtid_next&#xff0c;即跳过这个GTID …