LeetCode 题目 119:杨辉三角 II

news/2024/6/16 17:29:02

作者介绍: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) // ireturn 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)),只存储需要的一行数据。
    • 方法三:由于缓存和递归的调用栈,空间复杂度较高。

不同算法的优劣势对比

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

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


http://www.mrgr.cn/p/15447620

相关文章

python教程12-面向对象进阶

1、classmethod类方法 类方法只能访问类变量,不能访问实例变量2、staticmethod静态方法 不能访问类变量,也不能访问实例变量。除非在实例调用时给方法传实例。3、反射1-判断对象是否有属性的情况 用法: 实例: __name__,模块被其他模块导入的时候调用,是你叫的名字。模块自…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口,输入npm cache clean --force 回车执行 2.打开控制面板,在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除:点击Path,点击编辑。 把环境变量中和node有关的全部移除,然后点击确定。 3.重…

Loongnix系统替换内核操作

Loongnix系统替换内核操作 一、终端下执行命令 sudo apt search linux-image* 返回结果中格式如: linux-image-4.19.0-19-loongson-3 为最新的内核源码。 二、下载内核源码包 sudo apt source linux-image-4.19.0-19-loongson-3 如提示:E: 您必须在 sources.li…

宝塔docker快速安装Halo

宝塔docker快速安装Halo 一、Docker 部署Halo 我们前面还是需要先在宝塔面板环境中安装Docker,一般默认时候是没有安装的。这里我们在宝塔面板中的Docker管理器应用商店中安装。我们可以看到直接等待安装成功。后面在部署程序的时候有需要用到这里界面。二、这里我们在【镜像管…

环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

一:题目 二:原理讲解 解决这个题目 ,我们得先理解它的原理。 1: 首先假设两个指针,一个快指针fast,一个慢指针slow,fast一次移动两个节点,slow一次移动一个节点。(前面…

决策管理中的数学方法

需要注意的是,用excel求解的时候需要导入线性规划加载项如下: pert分析需要DecisionTools中的RiskSolver插件 1.链接:https://pan.baidu.com/s/1wKhUFWgNmQ7U33kl5AypZw 提取码:zqkn 2.“Palisade_Book_expires_Aril_10_2025.lic”文件复制到以下路径: C:\Program Files …

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求(传参)2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查,实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

1.分布式-理论

目录 一、什么是分布式系统 二、CAP理论 1.一致性Consisency 2.可用性(Availability) 3.分区容错性(Partition tolrance) 三、BASE理论 1.Basically Available(基本可用) 2.Soft state&#xff08;软状态&#xff09; 3.Eventually consistent&#xff08;最终一致性&a…

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…

Bean的作用域和自动装配

Spring Bean的作用域主要有五种Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。 prototype是原型类型,它在我们创建容…

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构&#xff0c;包括for和while的使用。本章接着往下讲。…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

跟着ChatGPT学算法-完全背包问题

一、题目 给定 n 个物品,第 i 个物品的重量为 wgt[i-1]、价值为 val[i-1] ,和一个容量为 cap 的背包。每个物品可以重复选取,问在限定背包容量下能放入物品的最大价值。二、和ChatGPT聊聊您 您是一位资深算法工程师,请深入浅出地给出完全背包问题的分析过程和完整带注释的J…

类型注解-Python

师从黑马程序员 类型注解的语法 类型注释的限制 import json import randomvar_1 : int10 var_2 : str"itheima" var_3 : boolTrueclass Student:pass stu :StudentStudent()my_list:list [1,2,3] my_tuple:tuple(1,2,3) my_dict:dict{"itheima":666}my_l…

MySQL5.7安装详细过程--window系统

一:MySQL5.7安装详细过程--window系统1.1、下载MySQL5.7安装包https://downloads.mysql.com/archives/community/1.2、将文件解压到盘符中你可以解压到你想解压的位置,放在C或其他盘符都可以。1.3、配置MySQL的环境变量由于我们下载的不是exe或者msi版本,不能直接双击安装,…

一文学会 Kubernetes Pod 的生命周期管理(转载)

收获 了解 Pod 的状态(Status) 了解 pod 阶段(Phase) 了解 Pod conditions了解容器状态(Status) 保持容器健康了解容器自动重启使用探活(liveness)探针(Probe)检查容器的健康状况如果程序启动缓慢,请使用 startup probeLiveness probe 一些建议 在容器启动和关闭时执…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

Rust 解决循环引用

导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我&#xff0c;我指向你&#xff0c;导致程序崩溃 解决方式可以通过弱指针&#xff0c;而Rust中的弱指针就是Weak 在Rc中&#xff0c;可以实现&#xff0c;对一个变量&#xff0c;持有多个不可变引…