LeetCode 题目 119:杨辉三角 II

作者介绍:10年大厂数据\经营分析经验,现任字节跳动数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python,欢迎探讨交流
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
漫画版算法详解
python源码解读
程序员必备的数学知识与应用

题目描述

给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。在这里,rowIndex 从 0 开始。

此题与生成杨辉三角的完整图形略有不同,要求的是能够直接计算出杨辉三角的某一特定行。因此,优化算法的空间复杂度是关键。

方法一:线性迭代

解题步骤:
  1. 初始化结果列表为 [1]
  2. 使用迭代方法更新列表,以模拟杨辉三角的每一行的计算。
  3. 对于每一行,从后向前更新,利用上一行的值计算当前行的值,避免前值被提前覆盖。
Python 代码示例
def getRow(rowIndex):
    row = [1] * (rowIndex + 1)
    for i in range(2, rowIndex + 1):
        for j in range(i - 1, 0, -1):
            row[j] += row[j - 1]
    return row

方法一使用线性迭代的方式计算杨辉三角的特定一行,这里通过 ASCII 图形来展示这个方法的工作过程,特别是如何迭代更新列表元素来模拟杨辉三角中的每一行的构建。

杨辉三角的特定行构建过程:线性迭代

假设我们需要计算杨辉三角的第5行(rowIndex = 4,从0开始计数)。

初始状态
  1. 初始化包含单个元素1的列表,代表杨辉三角的第0行。
[1]
第1行
  1. 迭代更新,添加一个1,现在列表代表第1行。
[1, 1]
第2行
  1. 开始第一个真正的迭代,将列表更新为第2行。先复制前一个元素,然后从后向前更新每个元素(除了第一个和最后一个,它们始终是1)。
[1, 2, 1]

更新过程:

  • 原始列表:[1, 1]
  • 插入新的第二元素(第一个元素 + 第二个元素):[1, 2, 1]
第3行
  1. 继续迭代更新为第3行。
[1, 3, 3, 1]

更新过程:

  • 原始列表:[1, 2, 1]
  • 插入新的第二元素(第一个元素 + 第二个元素):[1, 3, 1]
  • 插入新的第三元素(第二个元素 + 第三个元素):[1, 3, 3, 1]
第4行
  1. 最后迭代更新为第4行。
[1, 4, 6, 4, 1]

更新过程:

  • 原始列表:[1, 3, 3, 1]
  • 插入新的第二元素(第一个元素 + 第二个元素):[1, 4, 3, 1]
  • 插入新的第三元素(第二个元素 + 第三个元素):[1, 4, 6, 1]
  • 插入新的第四元素(第三个元素 + 第四个元素):[1, 4, 6, 4, 1]
总结步骤
  • 开始时列表只有一个元素1
  • 对于每一新行,从后向前更新列表中的每个元素,使得每个元素等于它自身加上前一个元素的值。
  • 这个过程不断重复,直到达到所需的行。

通过这种方式,可以在不需要计算整个杨辉三角的情况下,直接生成所需行的元素,极大地优化了空间和时间效率。

方法二:使用公式(组合数)

解题步骤:

在这里插入图片描述

Python 代码示例
def getRow(rowIndex):
    row = [1] * (rowIndex + 1)
    for i in range(1, rowIndex // 2 + 1):
        row[i] = row[rowIndex - i] = row[i - 1] * (rowIndex - i + 1) // i
    return row

方法三:递归与缓存

解题步骤:
  1. 使用递归函数通过前一行计算当前行。
  2. 使用一个缓存(字典)来存储已计算过的行,避免重复计算。
Python 代码示例
from functools import lru_cache

@lru_cache(None)
def getRow(rowIndex):
    if rowIndex == 0:
        return [1]
    elif rowIndex == 1:
        return [1, 1]
    previous_row = getRow(rowIndex - 1)
    row = [1] + [previous_row[i] + previous_row[i + 1] for i in range(rowIndex - 1)] + [1]
    return row

算法分析

  • 时间复杂度
    • 方法一:(O(n^2)),其中 (n) 是行号。
    • 方法二:(O(n)),利用了数学公式直接计算,但每个计算涉及乘除操作。
    • 方法三:(O(n^2)),虽然有缓存,但每行的计算仍需之前所有行的数据。
  • 空间复杂度
    • 方法一和二:(O(n)),只存储需要的一行数据。
    • 方法三:由于缓存和递归的调用栈,空间复杂度较高。

不同算法的优劣势对比

  • 线性迭代(方法一)简单高效,适合大多数实现场景。
  • 使用公式(方法二)空间和时间效率高,但在实现时需注意数值运算的精度和效率。
  • 递归与缓存(方法三)易于理解和实现,但空间复杂度较高,适用于对空间复杂度要求不高的场景。
应用示例

这些方法可以用在需要快速计算组合数的场景,例如统计学中的概率计

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS 提交项目到github(本地没有该项目)

流程简介 申请github账号(如果有请跳过) add repository创建项目开心的提交就好 具体过程 1. 申请账号(本部分不做介绍,请自行研究) 2. 如果有账号,按照下面图片依次操作就好 点击该图中的New reposito…

Qt开发常见报错大全与解决办法

下面的报错是我日常开发经常遇到的,对着下面的解决方法一招搞定就行了。 我们没必要都去记住,只需要见方抓药即可。 目前版本有27个常见报错,持续更新中。 常见报错 翻译不起作用 你可能改了类名字,但是.ts文件里没有跟着改。 Cannot send events to objects owned by a…

物联网杀虫灯—新型的环保杀虫设备

型号推荐:云境天合TH-FD2S】物联网杀虫灯是一种新型环保杀虫设备,其中风吸式太阳能杀虫灯作为其一种特殊类型,展现了独特的工作原理和优势。 风吸式太阳能杀虫灯以太阳能电池板为电源,白天储存电源,晚上为杀虫灯提供电…

在系统学习C语言之前所需要了解的知识

C语言常见概念 前言1. C语言是什么2. C语言的历史和辉煌3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点优点:缺点: 4. VS项目和源文件、头文件介绍5. 第⼀个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII…

[muduo网络库]——muduo库三大核心组件之EventLoop类(剖析muduo网络库核心部分、设计思想)

接着上一节[muduo网络库]——muduo库三大核心组件之 Poller/EpollPoller类(剖析muduo网络库核心部分、设计思想),我们来剖析muduo库中最后一类核心组件,EventLoop类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 Ev…

通过acl设置阻止数据包通过

实验拓扑和信息如图(配置信息参考上一章内容) acl设置代码 AR4 系统是视图下 acl 2000 rule 5 deny source 10.10.10.1 0 接口0视图下 数据接收时 traffic-filter inbound acl 2000 测试结果

【数据结构练习题】Map与Set——1.只出过一次的数字2.复制带随机指针的链表3.宝石与石头4.坏键盘打字

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥【数据结构练习题】堆——top-k问题♥♥♥♥♥ 文章目录 1.只出过一次的数字1.1问题描述1.2思路分析1.3绘图分析1.4代码实现2.复制带随机指针的链表2.1问题描述2.2思路分析2.3绘图分析2.4代…

Electron学习笔记(六)

文章目录 相关笔记笔记说明 七、系统5、托盘图标(1)、设置托盘图标(2)、托盘图标闪烁(3)、托盘图标菜单 6、剪切板(1)、写入剪切板(2)、读取剪切板 7、系统通知8、其他(1)、使用系统默认应用打开文件(2)、接收拖拽到窗口中的文件(3)、使用系统字体 相关笔记 Electron学习笔记&…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 驾校管理 设计与实现

一.项目介绍 系统角色:管理员、驾校教练、学员 管理员: 个人中心:修改密码以及个人信息修改 学员管理:维护学员信息,维护学员成绩信息 驾校教练管理:驾校教练信息的维护 驾校车辆管理&…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现,项目以Web系统形式展示,利用Xpath爬虫爬取去哪儿网针对旅游业的需求,对国内热门旅游景点数据可视化系统,将爬取好的数据保存为CSV文件,再通过ORM框架导入MySQL数…

[muduo网络库]——muduo库Buffer类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库Socket类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的Buffer类。其实Buffer在我的另一篇博客里面已经介绍过了深究muduo网络库的Buffer类!!!&am…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案,在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上,同时提供了高可用的支持,当某个master节点挂了之后,整个集群还是可以正常工作。1、为什么要用Redis Cluster…

Kafka 业务日志采集最佳实践

简介 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据流管道和应用程序。在收集业务日志的场景中,Kafka 可以作为一个消息中间件,用于接收、存储和转发大量的日志数据。将 Kafka 与其他系统(如 Elasticsearch、Flume、…

AtCoder Beginner Contest 353 A~E(F,G更新中...)

A.Buildings 题意 给出若干个建筑,每个建筑有一个高度,问,从第二个建筑开始,比第一个建筑高的建筑中编号最小的是多少?如果不存在,输出-1. 分析 边输入边比较即可,如果循环结束还未找到&…

【muzzik 分享】Cocos 物理帧同步

# 前言 之前没研究帧同步,这是我前端时间没上班时边玩边搞做的 Demo 研究成果,总共时间一周(实际2-3天),发布的目的也很简单,打破技术垄断,才能诞生更高端的技术成果。而且就算我没发这篇帖子&…

重生奇迹mu战士攻略有哪些

1、生命之光:PK前起手式,增加血上限。 2、雷霆裂闪:眩晕住对手,战士PK战士第一技能,雷霆裂闪是否使用好关系到胜负。 3、霹雳回旋斩:雷霆裂闪后可以选择用霹雳回旋斩跑出一定范围(因为对手下一招没出意外…

Mybatis技术内幕-基础支撑层

整体架构 MyBatis 的整体架构分为三层, 分别是基础支持层、核心处理层和接口层。 基础支持层 基础支持层包含整个MyBatis 的基础模块,这些模块为核心处理层的功能提供了良好的支撑。 解析器模块 XPathParser MyBatis提供的XPathParser 类封装了XPat…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos,我们需要有Nacos-Server,此处就不使用官方提供的release版本了,而是自己编译,因为本来就是Java开发的,所以对于Javaer来说也没啥难度! git c…

记nrm管理仓库以及发布npm包

前言 记一次在公司创建私有库以及发布npm包,留下个脚印 一、nrm是什么? nrm是 npm 镜像源管理工具,用于快速地在不同的 npm 源之间切换。 二、使用步骤 1.全局安装nrm 代码如下(示例): npm install -…

Git系列:git diff使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…