LeetCode 题目 118:杨辉三角

题目描述

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。

杨辉三角解析

在这个详解中,我们将使用 ASCII 图形来说明杨辉三角的构建过程,包括逐行添加新的行的过程。这个图解可以帮助理解每一行是如何基于前一行构建的。

杨辉三角的构建过程

初始状态
  1. 开始时,杨辉三角是空的。
第1行
  1. 添加第一行,只有一个数字 1
1
第2行
  1. 第二行有两个 1,每个都位于行的边界。
1
1 1
第3行
  1. 第三行中间的数字是上一行两个相邻数字之和(1 + 1)。
  11 1
1 2 1
第4行
  1. 第四行,中间的两个数字分别是上一行相邻两数之和(1+2 和 2+1)。
    11 11 2 11 3 3 1
第5行
  1. 第五行,中间三个数字由上行相邻数字之和得到(1+3、3+3 和 3+1)。
      11 11 2 11 3 3 11 4 6 4 1
总结过程
  • 杨辉三角的每一行都从 1 开始和结束。
  • 除了第一个和最后一个数字外,每个数字都是它正上方两个数字的和。
  • n 行(从 1 开始计数)有 n 个数字。

解题思路与算法

方法一:逐行构建
解题步骤:
  1. 初始化一个空列表 triangle 作为结果。
  2. 遍历从 0numRows-1 的每一行。
  3. 对于每一行,创建一个长度等于行号加一的新行,首尾元素设为1。
  4. 对于每一行的中间元素,按照杨辉三角的规则,由上一行的相邻两个元素求和得到。
  5. 将构建好的行添加到 triangle 中。
Python 代码示例
def generate(numRows):"""生成杨辉三角的前numRows行"""triangle = []for row_num in range(numRows):row = [None for _ in range(row_num + 1)]row[0], row[-1] = 1, 1  # 第一个和最后一个元素始终为1for j in range(1, len(row) - 1):row[j] = triangle[row_num - 1][j - 1] + triangle[row_num - 1][j]triangle.append(row)return triangle
方法二:一行代码解
解题步骤:
  1. 使用列表推导式和递推公式直接生成杨辉三角的每一行。
  2. 利用 Python 的生成器语法简化代码实现。
Python 代码示例
def generate(numRows):"""一行代码生成杨辉三角"""return [[1 if j == 0 or j == i else triangle[i-1][j-1] + triangle[i-1][j] for j in range(i+1)] for i in range(numRows)]
方法三:动态规划
解题步骤:
  1. 初始化一个空列表 triangle
  2. 从第一行到第 numRows 行,利用动态规划的思想,每一行基于前一行生成。
  3. 同样地,每行的首尾元素为1,其他元素由上一行的两个相邻元素相加得到。
  4. 每生成一行即存入 triangle
Python 代码示例
def generate(numRows):triangle = []for row_num in range(numRows):row = [1] * (row_num + 1)  # 每行元素初始化为1for j in range(1, row_num):row[j] = triangle[-1][j - 1] + triangle[-1][j]triangle.append(row)return triangle
方法四:使用递归
解题步骤:
  1. 定义递归函数,如果请求行数为1,返回只包含一行的杨辉三角。
  2. 否则,递归调用自身生成前 numRows - 1 行,然后基于最后一行计算新的一行,并添加到结果中。
Python 代码示例
def generate(numRows):if numRows == 1:return [[1]]else:result = generate(numRows - 1)last_row = result[-1]new_row = [1]for i in range(1, len(last_row)):new_row.append(last_row[i - 1] + last_row[i])new_row.append(1)result.append(new_row)return result
方法五:迭代改进版
解题步骤:
  1. 初始化一个包含第一行的列表。
  2. 迭代从第二行开始,每一行都通过上一行来计算。
  3. 使用临时列表存储当前行,计算完成后加入最终结果。
Python 代码示例
def generate(numRows):triangle = [[1]]for row_number in range(1, numRows):prev_row = triangle[-1]current_row = [1]for j in range(1, row_number):current_row.append(prev_row[j-1] + prev_row[j])current_row.append(1)triangle.append(current_row)return triangle

算法分析

  • 时间复杂度
    • 所有方法的时间复杂度基本为 (O(n^2)),其中 (n) 是行数。每行的计算成本大约与行号成正比。
  • 空间复杂度
    • 方法一、三、四和五:(O(n^2)),需要存储整个三角形。
    • 方法二:同样是 (O(n^2)),但因为使用了列表推导,可能有额外的内存开销。

不同算法的优劣势对比

  • 逐行构建(方法一)直观易理解,适合大多数初学者。
  • 一行代码解(方法二)代码简洁,但可能在理解和调试时较为复杂。
  • 动态规划(方法三)标准且易于理解,展示了动态规划思想的典型应用。
  • 使用递归(方法四)代码简洁,但对于大的行数可能导致调用栈溢出。
  • 迭代改进版(方法五)提供了介于方法一和方法三之间的解决方案,保持了代码的清晰性和执行的高效性。

应用示例

杨辉三角可以用于计算组合数学中的二项式系数,这在概率论、统计学和算法设计中非常有用。例如,它可以用来计算多项式展开的系数,或者在计算概率时快速找到相关的系数。在图形设计中,杨辉三角也被用于计算贝塞尔曲线等复杂图形的点。

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

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

相关文章

250 基于matlab的5种时频分析方法((短时傅里叶变换)STFT

基于matlab的5种时频分析方法((短时傅里叶变换)STFT,Gabor展开和小波变换,Wigner-Ville(WVD),伪Wigner-Ville分布(PWVD),平滑伪Wigner-Ville分布(SPWVD),每条程序都有详细的说明,设置仿真信号进行时频输出。…

Parted分区大容量磁盘

创建了新的虚拟磁盘10T , 挂载后分区格式化一.fdisk无法创建大容量的分区 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css实现个人简历表单的制作

根据下列要求,做出下图所示的个人简历(表单) 表单要求 Ⅰ、表格整体的边框为1像素,单元格间距为0,表格中前六列列宽均为100像素,第七列 为200像素,表格整体在页面上居中显示; Ⅱ、前…

git提交代码异常报错error:bad signature 0x00000000

报错信息 error:bad signature 0x00000000 异常原因 git 提交过程中异常关机或重启,造成当前项目工程中的.git/index 文件损坏,无法提交 解决步骤 删除.git/index文件 rm -f .git/index 重启git git reset

Java 【数据结构】 哈希(Hash超详解)HashSetHashMap【神装】

登神长阶 第十神装 HashSet 第十一神装 HashMap 目录 👔一.哈希 🧥1.概念 🩳2.Object类的hashCode()方法: 👚3.String类的哈希码: 👠4.注意事项: 🎷二.哈希桶 🪗1.哈希桶原理 &#x…

Bert基础(二十二)--Bert实战:对话机器人

一 、概念简介 1.1 生成式对话机器人 1.1.1什么是生成式对话机器人? 生成式对话机器人是一种能够通过自然语言交互来理解和生成响应的人工智能系统。它们能够进行开放域的对话,即在对话过程中,机器人可以根据用户的需求和上下文信息,自主地生成新的、连贯的回复,而不仅…

如何使用CertCrunchy从SSL证书中发现和识别潜在的主机名称

关于CertCrunchy CertCrunchy是一款功能强大的网络侦查工具,该工具基于纯Python开发,广大研究人员可以利用该工具轻松从SSL证书中发现和识别潜在的主机信息。 支持的在线源 该工具支持从在线源或给定IP地址范围获取SSL证书的相关数据,并检索…

大数据测试

1、前言 大数据测试是对大数据应用程序的测试过程,以确保大数据应用程序的所有功能按预期工作。大数据测试的目标是确保大数据系统在保持性能和安全性的同时,平稳无差错地运行。 大数据是无法使用传统计算技术处理的大型数据集的集合。这些数据集的测试涉…

Foxmail使用经验总结

本篇博客将详尽讲解如何利用Foxmail进行高效的邮件管理,以及一些实用的使用技巧,让邮件管理变得更为高效和有序。 1. 账户设置与管理 多账户整合:Foxmail支持多个邮件账户同时管理,用户可以将个人和工作邮箱整合在同一个界面&am…

实战中使用 QEMU 进行内网穿透

前言 阅读 https://xz.aliyun.com/t/14052 《使用 QEMU 进行内网穿透?》 https://securelist.com/network-tunneling-with-qemu/111803/ 《Network tunneling with… QEMU?》 我将此项技术应用到实战中,取得不错的效果,但是也遇到很多坑&am…

机器学习算法应用——朴素贝叶斯分类器

朴素贝叶斯分类器 朴素贝叶斯分类器(Naive Bayes Classifier)是一种基于贝叶斯定理和特征条件独立假设的分类方法。它适用于分类任务,特别是文本分类、垃圾邮件识别等领域。 原理 朴素贝叶斯分类器基于以下两个主要假设: 特征条…

JS_ES6(1)

作用域链: 作用域链是底层变量查找的机制:当函数执行时,优先查找当前函数作用域中有无需要用到的变量,如果找不到,逐级查找父级,直到全局 > 嵌套关系形成作用域链,同一作用域链从小到大查找…

taro3兼容支付宝/微信小程序的自定义拖拽排序组件

描述:列表可以完成拖拽排序 此组件是根据支付宝原生文档改编成taro-vue3的形式,只保留了拖拽的部分,其他功能都去除了,测试下来可以兼容支付宝和微信小程序。 支付宝原生文档: https://opendocs.alipay.com/support/…

BGP(border gateway protocol)边界网关协议初识篇

BGP它是一种路径矢量协议,用于决定数据包在互联网中的最佳路径。 1、工作原理: 自治系统(AS)间路由: BGP主要用于连接不同自治系统之间的路由器,其中每个自治系统(AS)代表一组具有共同路由的网…

编译 fdk-aac

文章目录 关于 fdk-aac编译 fdk-aac在 FFMpeg 编译中启用 关于 fdk-aac A standalone library of the Fraunhofer FDK AAC code from Android. github : https://github.com/mstorsjo/fdk-aac代码托管 : https://sourceforge.net/projects/opencore-am…

最新巨量X-Bogus、_signature参数逆向分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. 扣代码补环境5. 数据解密 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路…

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构(十六) 一、SpringCloudStream:自定义消息通道 1、在子工程 stream_product (子模块)中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…

【负载均衡式在线OJ项目day5】OJ服务模块概要

前言 经过四天的努力已经完成了编译运行这个大模块,今天将要进入OJ服务模块设计,该模块的本质就是建立一个小型网站 一.功能 为用户提供题目列表页面为用户提供网站首页(用题目列表充当首页)为用户提供指定题目的编辑页面为用户提供提交代码判题功能&a…

FFmpeg常用API与示例(二)—— 解封装与转封装

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…