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

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

题目描述:

        给定一个非负整数 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的一些知识。

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

              

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

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

相关文章

Elasticsearch的使用教程

Elasticsearch简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心&#xff0c;Elasticsearch 会集中存储您的数据&#xff0c;让您飞快完成搜索&#xff0c;微调相关性&#xff0c;进行…

Pytorch-张量形状操作

&#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; &#x1f339; reshape 函数 transpose 和 permute 函数 view 和 contigous 函数 squeeze 和 unsqueeze 函数 在搭建网络模型时&#xff0c;掌握对张量形状的操作是非常重要的&#xff…

智慧电网数据可视化运维云平台解决方案

智慧电力概述 智慧电力是通过采用先进的大数据、云计算、物联网、边缘计算等技术&#xff0c;实现生产信息与管理信息的智慧&#xff0c;实现人、技术、经营目标和管理方法的集成&#xff0c;是企业管理思想的一个新突破。智慧电厂建设具备智能化、一体化、可观测、可互动、自…

实验一:配置IP地址

1.实验环境 主机A和主机B通过一根网线相连 2.需求描述 为两台主机配置IP地址&#xff0c;验证IP地址是否生效&#xff0c;验证 同一网段的两台主机可以互通&#xff0c;不同网段的主机不能 直接互通 3.推荐步骤 1. 为两台主机配置P地址&#xff0c;主机A为10.0.10.10&#…

python 头文件怎么写

本文主要以python2为例。首先介绍一下Python头文件的编程风格&#xff0c;然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。 编程风格 #!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器 # -*- coding: utf…

pyqt的人脸识别 基于face_recognition库

参考文献&#xff1a; 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下&#xff1b;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

FTP服务器的搭建(windows)

一、开启FTP功能 1.控制面板 2.卸载程序 3. 启用或关闭windows功能 4.勾选 5.确定 二、创建登录ftp的账户 1.此电脑右击管理 三、创建FTP服务器 1.win键&#xff0c;输入iis 2.点击IIS管理器 四、测试 1.查看本机ip地址 2.打开一个文件夹&#xff0c;输入ftp://192.168.103…

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…

python代码打包exe文件

创建和激活虚拟环境 创建虚拟环境 首先让我们创建一个虚拟环境。你可以使用 venv 模块来创建一个虚拟环境。以下是创建虚拟环境的步骤&#xff1a; 打开终端&#xff08;或命令提示符&#xff09;&#xff1a;进入你想要创建虚拟环境的目录。 运行以下命令来创建虚拟环境&a…

OLAP引擎优缺点简单对比

总结&#xff1a; 数据压缩率Clickhouse好&#xff1b;ClickHouse单表查询性能优势巨大&#xff1b;Join查询两者各有优劣&#xff0c;数据量小情况下Clickhouse好&#xff0c;数据量大Doris好&#xff1b;Doris对SQL支持情况要好&#xff1b;

Java集合进阶——泛型

1.泛型 介绍&#xff1a; 泛型可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 应用场景&#xff1a; 如果在定义类、方法、接口的时候&#xff0c;如果类型不确定&#xff0c;就可以使用泛型。 格式&#xff1a; <数据类型> 注意&#xff1a; 泛型只支持引…

暴力破解密码自动阻断

1 re模块 re 模块是 Python 中用于正则表达式操作的模块。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来表示字符串中的模式&#xff0c;并可以通过模式匹配、查找、替换等操作对文本进行高效处理。 …

springboot 使用 mybatis 快速上手

创建数据库表对应的实体类 Data public class Template {private int id;private String name;private String type;private int productId;private Timestamp createTime;private Timestamp updateTime;private Timestamp deleteTime; }创建 TemplateMapper.java Mapper pub…

Spring GA、PRE、SNAPSHOT 版本含义及区别

GA:General Availability: 正式发布的版本&#xff0c;推荐使用&#xff08;主要是稳定&#xff09;&#xff0c;与maven的releases类似&#xff1b; PRE: 预览版,内部测试版。主要是给开发人员和测试人员测试和找BUG用的&#xff0c;不建议使用&#xff1b; SNAPSHOT: 快照…

InnoDB架构:内存篇

InnoDB架构&#xff1a;内存篇 InnoDB是MySQL数据库中默认的存储引擎&#xff0c;它为数据库提供了事务安全型&#xff08;ACID兼容&#xff09;、行级锁定和外键支持等功能。InnoDB的架构设计优化了对于读取密集和写入密集型应用的性能表现&#xff0c;是一个高度优化的存储系…

# Nacos 服务发现-Spring Cloud Alibaba 综合架构实战(四) -实现 service2 子模块。

Nacos 服务发现-Spring Cloud Alibaba 综合架构实战&#xff08;四&#xff09; -实现 service2 子模块。 1、在 service2 子模块下的 service-2-api 二级子工程中&#xff0c;定义服务接口 创建 ProviderService.java /*** C:\java-test\idea2019\nacos_discovery\nacos-mi…

Python 入门指南(二)

原文&#xff1a;zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三章&#xff1a;迭代和做决定 “疯狂就是一遍又一遍地做同样的事情&#xff0c;却期待不同的结果。”- 阿尔伯特爱因斯坦 在上一章中&…

k8s基础入门

前言 开始学习K8S了&#xff0c;下面就是笔记整理 简介 k8s是谷歌开源得容器管理系统&#xff0c;主要功能包括 基于容器得应用部署&#xff0c;维护和滚动升级负载均衡和服务发现跨机器和跨地区得集群调度自动伸缩无状态服务和有状态服务广泛得Volume支持插件保持扩展性 …

JavaScript快速入门

目录 一、初始JavaScript 1、JavaScript是什么 2、JavaScript快速上手 3、引入方式 二、基础语法 1、变量 2、数据类型 3、运算符 三、JavaScript对象 1、数组 &#xff08;1&#xff09;数组的定义 a、使用 new 关键字创建 b、使用字面量方式创建&#xff08;常用…

byobu

byobu 终端多路复用器 一、byobu 安装二、byobu 使用三、其他终端多路复用器四、ssh byobu 远程协作 系统环境: linux(ubuntu,debian,kali) 一、byobu 安装 byobu 是包装过的tmux #sudo apt install tmux sudo apt install byobubyobu二、byobu 使用 创建窗口: Ctrl a c…