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) // 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.mzph.cn/diannao/10741.shtml

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

相关文章

Redis——Redis的数据库结构、删除策略及淘汰策略

Redis是一个高性能的key-value存储系统,它支持多种数据结构,并提供了丰富的删除策略和淘汰策略。以下是关于Redis的数据库结构、删除策略及淘汰策略的详细介绍: Redis的数据库结构 Redis是一个key-value数据库,数据存储是以一个…

day06-07面向对象(高级)

面向对象(高级) 知识回顾: 1.面向对象基础 类的定义 对象的使用 private关键字 this关键字 封装 构造方法 JavaBean2.API 的使用 知识回顾 Scanner Random String Date1.继承 查看下述代码: 发现有什么问题? 你所抽取的代码没有了,怎么办&#xff1f…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的,编写代码时发现无论怎样修改代码,运行后都没有任何变化,以为是qtbug,重构重启都没用,最后…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件: 例如:将home.ui文件转为vio_detect.py文件,所需命令如下: pyuic5 -x home.ui -o vio_detect.py

XXE-lab靶场搭建

源码下载地址 https://github.com/c0ny1/xxe-lab1.php_xxe 直接放在php web页面下即可运行。 2.java_xxe java_xxe是serlvet项目,直接导入eclipse当中即可部署运行。 3.python_xxe: 安装好Flask模块python xxe.py 4.Csharp_xxe 直接导入VS中运行 phpstudy…

内存操作数及寻址方式

debug命令 debug命令,即DOS实用程序。DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程…

编程代码的舞者--Python循环语句

循环语句是编程中不可或缺的要素之一,它们能够让程序反复执行特定的任务,提高代码的重复利用性和效率。在本篇博客中,我们将深入探讨Python中常用的循环语句,包括for循环和while循环,以及控制循环流程的关键字break和c…

转载:ubuntu18.04 安装wine以及添加mono和gecko打开简单.net应用的方法

https://www.cnblogs.com/jinanxiaolaohu/p/12191576.html 1. 今天突然想试试能不能用ubuntu跑一下公司的.net的智能客户端(SmartClient). 想到的办法就是 安装wine 但是过程略坑..这里简单说一下总结之后的过程. 2. 第一步安装wine相关内容 查了下有winehq和wine两种. …

C语言如何证明联合体变量的所有成员是共享⼀个内存单元的?

一、问题 联合体⼜名共⽤体,⽤共⽤体这个名字更能体现这个类型的特点,那就是所有成员变量共⽤⼀个内存单元。 联合体变量的这⼀特点决定了联合体变量的使⽤⽅法,即在某⼀时刻只有⼀个成员有意义,其他成员⽆意义。那么,…

算法专题:位运算

目录 常见位运算总结 位运算相关算法题 1. 只出现一次的数字 2. 只出现一次的数字(|||) 3. 两整数之和 4. 只出现一次的数字(||) 常见位运算总结 在开始刷位运算这个类型的题目前,我想先带着大家学习一下一些常见…

程序员录制真人出镜类课程

真人出镜类课程片段的制作 接下来,我们来具体讲解真人出镜类课程片段的创建过程。 什么是真人出镜类课程片段 「真人出镜」类型的视频只需通过摄像头、手机或摄像机直接进行录制即可。然而,当涉及到真人出镜的课程时,情况就相对复杂一些。这…

手机在网状态多方面重要性

手机在网状态的重要性体现在多个方面,它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释: 通信联系: 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…

【Python单点知识】类成员汇总讲解——包含类方法、静态方法、私有成员说明

文章目录 0. 前言1. 属性(Attributes)1.1 类属性(Class Attributes)1.2 实例属性(Instance Attributes) 2. 方法(Methods)2.1 实例方法(Instance Methods)2.2…

算法实战:亲自写红黑树之三 算法详解

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 此文承接:算法实战…

动态规划:力扣LCR 188. 买卖芯片的最佳时机

题目 数组 prices 记录了某芯片近期的交易价格,其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片,并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利…

【软考高项】四十四、高级项目管理

一、项目集管理 相关角色 项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人项目集管理绩效域 项目集战略一致性、项目集效益管理、项目集干系人参与、项目集治理和项目集生命周期管理 二、项目组合管理 项目组合经理角色 项目组合管理原…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录,这次打算开始学习模仿学习的相关原理,参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

java项目之汽车资讯网站源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 汽车资讯网站的主要使用者管…

Vue从入门到实战Day04

一、组件的三大组成部分(结构/样式/逻辑) 1. scoped样式冲突 默认情况:写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式:默认组件中的样式会作用到全局 2. 局部样式:可以…

LeetCode 138. 随机链表的复制

目录 1.原题链接: 2.结点拆分: 代码实现: 3.提交结果: 4.读书分享: 1.原题链接: 138. 随机链表的复制 2.结点拆分: ①.拷贝各个结点,连接在原结点后面; ②.处…