算法题解记录13+++杨辉三角(百日筑基)

news2025/2/7 13:15:30

        本题是动态规划的问题,我也在此阐述我对动态规划的理解,如有不准确、缺失、错误,敬请斧正。

题目描述:

        给定一个非负整数 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

解题准备:

        1.了解杨辉三角:杨辉三角不是传统意义上的某种结构,而是一种具有规律的特殊结构,其满足:第一,对于每一行,第一个和最后一个数据都为1===第二,对于每一行,除开第一个和最后一个数据,其它数据等于前一行前一列+前一行同列。【边界值除外,比如第一行】(如果把它看成一个L型的直角三角形则更好理解)

        2.理顺题目要求:生成numRows的杨辉三角。所以首要目的是了解杨辉三角。

解题难点1分析:

        难点1:存储问题

                其实很容易知道,杨辉三角的第i行数据,取决于第i-1行数据,我们首要考虑的,是如何存储第i-1行数据。

                有人说,这也难?第一行用个List<Integer> list,然后list.add(1),同理第i-1行,list.add(i-1【的结构】)顺手的事。

                不过,list存储没有问题,却消除了第i行和第i-1行之间的列关系(行关系也删除了),而且既不知道i-1行,第i行的数据从何而来?如果再深入,不知道i-2行,第i-1行从何而来?

                所以得思考:

              如何保持第i行和第i-1的行、列关系?

                        其实杨辉三角完全可以看成一个numRows*numRows的矩阵。

                        对于第i行,后面numRos-i的数据都为0,前i个数据为真实数据。【这里的i,从1开始,不是计算机里从0开始】

                        如果用矩阵存储,那么第1行数据,有matrix【1】【1】=1

                        第2行,matrix【2】【1】=1;matrix【2】【2】=1;

                        重点是,第3行及之后,matrix【3】【1】=1;matrix【3】【2】=2;matrix【3】【3】=1;===可以发现,matrix【3】【2】恰好等于matrix【2】【1】+matrix【2】【2】,即解题准备的问题。

                        因此,使用矩阵(也就是二维数据,即可很好地存储第i行和i-1行的行、列关系)

                节约空间:

                        不过,矩阵的存储,明显要浪费掉接近一半的空间。

                        已知,杨辉三角,对于第i行,其元素个数=第i-1行的个数+1,有此规律,可以创建更为精简的动态增加的数组,毕竟Java的数组允许事先不new。

        难点2:理解问题

                有人会有疑问:我知道杨辉三角的规律,可是写起来还是非常困惑。

                既然第i行和第i-1行有关系,可是事先只知道第一行?(也许有第二行)

                        因此,杨辉三角理论上可以用递归的方式解答,不过代码比较难写,因为要输入一个含有i个数据的数组,返回i+1个数据的数组,结束条件为:如果i==1,返回【1】。

                        有是有,但是写起来相当麻烦和抽象。

                        不过动态规划的思想解决了该问题,动态规划:把大问题分解成小问题,记录这些小问题的解,最终形成整体答案。

                        既然只知道第一行和第二行,那么第三行算出来后,记录下来(存储在矩阵里),计算第四行时,再使用不就行了?

                我们有第一行的解,就能算出第二行,有第i-1行的解,就能算出第i行。

                此时,我们已经有了最小问题的解,把过程数据记录下来,就能算出答案。

代码:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        Integer data[][] = new Integer[numRows][];
        data[0]=new Integer[1];
        data[0][0]=1; // 第一行,最小问题的解

        // 要求生成numRows行杨辉,从1开始是因为第一行已经生成
        for(int i=1; i<numRows; i++){
            data[i]=new Integer[i+1];
            data[i][0]=1; // 前后一定是1
            data[i][i]=1;
            // 从1开始,因为0已经赋值,到达i-1,因为i也被赋值
            for(int j=1; j<i; j++){
                data[i][j]=data[i-1][j-1]+data[i-1][j];
            }
        }

        // asList表示把数组转变为list
        for(Integer[] rows:data){
            result.add(Arrays.asList(rows));
        }

        return result;
    }
}

动态规划的补充: 

       动态规划和分治法有相同之处,都是分解子问题,只是分治法覆盖全面且相互独立,动态规划覆盖全面但有重叠。

        动态规划的核心,是拿到状态转移方程,状态转移方程是指,如何从一个子问题,得到问题的解,是一个递归式子。

        比如本题,本题想构造numRows行杨辉三角,其难点不是将数据存入list,而是知道如何构造,需要哪些数据(比如i行与i-1行的关系)

        如何构造,已知每一行,第1个和最后一个都是1,那么难点就在于中间的数据。中间数据的求解,就涉及状态转移方程。     

        本题的状态转移方程,就是data【i】【j】=data【i-1】【j-1】+data【i-1】【j】

以上内容即我想分享的关于力扣热题13的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

              

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

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

相关文章

激光雷达初识

一、实车激光雷达 一般在车顶位置: 二、激光雷达组成 激光收发器模块:发射激光器VCSEL+接收模块采用了SiPM(硅基光电倍增管)或者APD,一个激光器发生失效的情况,其他仍可正常工作 扫描模块:水平视场和的垂直视场的扫描,128个阵列的VCSEL激光器负责 信号处理模块:信号处…

3_2Linux中内核级加强型火墙的管理

### 一.Selinux的功能 ### 观察现象 ①当Selinux未开启时 在/mnt中建立文件被移动到/var/ftp下可以被vsftpd服务访问 匿名用户可以通过设置后上传文件 当使用ls -Z /var/ftp查看文件时显示"?" ps auxZ | grep vsftpd 时显示&#xff1a; - root 8546 0.0 0.0 26952 …

从iPhone恢复已删除照片的最佳软件

本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片&#xff0c;请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片&#xff1f; 没有什么比丢失iPhone上的重要数据更痛苦的了&#xff0c;尤其是一些具有珍贵回忆的照片。有时…

Java面试必问题38:SpringMVC执行流程(工作原理)(一般必问) SpringMVC的常用注解

MVC 是 Model — View — Controler 的简称&#xff0c;它是一种架构模式&#xff0c;它分离了表现与交互。它被分为三个核心部件&#xff1a;模型、视图、控制器。 Model&#xff08;模型&#xff09;&#xff1a;是程序的主体部分&#xff0c;主要包含业务数据和业务逻辑。在…

Python 版分布式消息队列 Kafka 实现图片数据传输

1、Kafka 介绍 在使用 Kafka 之前&#xff0c;通常需要先安装和配置 ZooKeeper。ZooKeeper 是 Kafka 的依赖项之一&#xff0c;它用于协调和管理 Kafka 集群的状态。 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它提供了可靠的数据存储和协调机制&#xff0c;用于协调…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库&#xff0c;该框架具备跨平台性&#xff0c;开源免费&#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能&#xff0c;使用libcurl可以方便地进行网络数据传输操作&#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…

【计算机毕业设计】物流管理系统设计与实现——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

Python(11):网络编程

文章目录 一、一些基本概念二、软件的开发架构&#xff08;c/s架构和b/s架构&#xff09;三、OSI模型四、socket套接字编程1.socket编程过程2.python中的socket编程 一、一些基本概念 来了解一些网络的基本概念 名词解释IP&#xff08;互联网协议地址&#xff09;IP用来标识网…

归并排序详解(附代码)

归并排序 数据科学家每天都在处理算法。 然而&#xff0c;数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色。 尽管如此&#xff0c;从业者仍然可以从建立对算法的理解和知识库中受益。 在本文中&#xff0c;对排序算法归并排序进行了介绍、解释、评估和实…

hds更换电源操作

HDS更换电源 1、 查看损坏的电源 2.选中电源 3、 如下图所示&#xff0c;选择Execute 4、选择ok&#xff0c;表示为防止静电引起的严重故障&#xff0c;请务必在手腕上佩戴腕带&#xff0c;并将腕带的另一侧的接地夹连接到机柜架上。 5、 选择YES&#xff0c;提示你的手…

Linux安装docker(含Centos系统和Ubuntu系统)

一、Centos系统 1. 卸载旧版本依赖 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2. 设置仓库 安装所需的软件包。yum-utils 提供了 yum-config-manager &…

高负压采样器

你的未来是你自己创造的&#xff0c;你的路是你自己选择的。走向成功&#xff0c;需要你的勇气和决心&#xff0c;成功不是得到多少&#xff0c;而是付出了多少。当你还在努力时&#xff0c;不要忘记身边的风景——鹤壁永成在你身边 一、高负压瓦斯采取器的用途&#xff1a; 高…

OpenHarmony实战开发-如何使用AKI轻松实现跨语言调用。

介绍 针对JS与C/C跨语言访问场景&#xff0c;NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式&#xff0c;一行代码完成JS与C/C的无障碍跨语言互调&#xff0c;使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数&#xff0c;创建子线程来调用JS函…

C++入门之类和对象

C入门之类和对象 文章目录 C入门之类和对象1. 类的6个默认对象2. 构造函数2.1 概念2.2 特性2.3 补丁 3. 析构函数3.1 概念3.2 特性3.3 总结 4. 拷贝构造函数4.1 概念4.2 特性4.3 总结 1. 类的6个默认对象 如果一个类中什么都没有&#xff0c;那么这个类就是一个空类。但是&…

UE5 C++ TimeLine 时间轴练习

一. Actor引入头文件 #include "Components/TimelineComponent.h" 声明CurveFloat 和 TimelineComponent UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyCurve")UCurveFloat* MyCurveFloat;UPROPERTY(EditAnywhere, BlueprintReadWrite, Cate…

科技助力上亿用户隐私安全保护,合合信息两款产品再获CCIA PIA星级标识

随着互联网技术的飞速发展&#xff0c;个人信息的收集、存储、使用和传输变得日益频繁&#xff0c;其泄露和滥用的风险也随之增加&#xff0c;个人信息保护已成为社会共同关注的热点议题。近期&#xff0c;“中国网络安全产业联盟&#xff08;CCIA&#xff09;数据安全工作委员…

密码学 | 椭圆曲线数字签名方法 ECDSA(上)

目录 1 ECDSA 是什么&#xff1f; 2 理解基础知识 3 为什么使用 ECDSA&#xff1f; 4 基础数学和二进制 5 哈希 6 ECDSA 方程 7 点加法 8 点乘法 9 陷阱门函数&#xff01; ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面…

OpenHarmony轻量系统开发【9】WiFi之STA模式连接热点

9.1AT指令操作WiFi 我们可以使用AT指令进行Hi3861 WiFi操作&#xff0c;连接热点、ping服务器等。 但是很多时候&#xff0c;我们需要实现开机后自动连接到某个热点&#xff0c;光靠AT指令不行。 Hi3861 为我们提供了WiFi操作的相关API&#xff0c;方便我们编写代码&#xff0…

GitLab 安全漏洞 CVE-2022-1162 如何解决?

本文来自极狐GitLab 官方公众号【极狐GitLab】&#xff0c;原文链接&#xff1a;https://mp.weixin.qq.com/s/JVpA14HHWgt58s3vM5TRcA。 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https…

文字转语音工具:GPT-SoVITS

诸神缄默不语-个人CSDN博文目录 OpenAI官方的TTS模型我在这篇博文中给出了使用教程&#xff1a;ChatGPT 3.5 API的调用不全指南&#xff08;持续更新ing…&#xff09; - 知乎 但是OpenAI的TTS对中文支持不好&#xff0c;有一种老外说中文的美&#xff0c;所以本文介绍另一个…