代码随想录刷题|LeetCode 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

news2024/9/19 11:23:41

目录

300.最长递增子序列

思路

1、dp[i]的定义

2、递推公式 

3、dp数组初始化

4、确定遍历顺序

5、推导dp数组

最长递增子序列

674. 最长连续递增序列

思路

最长连续递增序列

动态规划

贪心算法

718. 最长重复子数组

思路

1、确定dp数组的含义

2、确定递推公式

3、dp数组初始化

4、遍历顺序

最长重复子数组

二维dp数组

一维dp数组


300.最长递增子序列

题目链接:力扣

思路

根据动态规划五部曲来对本题目进行分析

1、dp[i]的定义

        dp[i] 表示 i 之前(包括i)的以nums[i] 结尾的 最长递增子序列的长度

        目前来看,dp数组的定义都是按要求的结果来

2、递推公式 

        既然求得是递增得子序列,每一个元素下面代表的是自己目前代表的最大递增长度

        位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值

        从前向后进行遍历,遍历到当前元素,跟前面的每一个元素进行比较,如果比之前的某个元素大,那就说明以这个元素结尾的字符串递增子序列长度还能再 +1,所以可以得出递推公式:dp[i] = dp[j] + 1

        要从其中找出最长的一个子序列,所以:dp[ i ] = max(dp[ i ], dp[ j ] + 1) 

3、dp数组初始化

        对于每一个 i,对应的dp[i],大小至少都是 1 .所以 dp 数组初始化都是1

4、确定遍历顺序

        因为后面的长度都是根据前面的数字情况来的,所以,应该从后向前进行遍历

for (int i = 1; i < dp.length; i++) {
    for (int j = 0; j < i; j++) {
        if (nums[i] > nums[j]) {
            dp[i] = Math.max(dp[i],dp[j] + 1);
        }
    }
}

        外层遍历:i 是在移动数组下标,以每个元素结尾的 最大递增子序列 都要算出来

        内层遍历:j 是每次从 0 - (i - 1) 进行遍历
                         如果当前的数字 nums[i] 是大于  nums[i] ,那就说明这个最大递增子序列还能在增加,增加后的长度就是dp[j] + 1,赋值给 dp[i]
                          但是这个结果还不是固定的,nums[i] 要遍历完以下标 0 - (i - 1)  结尾的所有最大递增子序列,找最长的结尾

        动画模拟:最长上升子序列_哔哩哔哩

5、推导dp数组

        这就像每一个元素,去最大自增子序列那里去竞聘,双向选择
        前面的子序列要选择比结尾还大的数字,对应代码中的if语句
        当前的元素要选择最长的长度,对应的就是递推公式

        举例说明:
        下标3,元素1,初始化是1,跟6比较,比6小,6不要它结尾
                                                     跟7比较,比7小,7不要它结尾
                                                     跟0比较,比0大,以0结尾的这个子序列可以以1结尾,如果以1结尾,以1 结尾的长度就是 1(以0结尾的长度) + 1 (多了元素3) = 2 ,所以 dp[3] = 2。
        再看看和目前代表的最大子序列长,max(1,2); 就获得了2
        ……

最长递增子序列

class Solution {
    public int lengthOfLIS(int[] nums) {

        // 创建dp数组
        int[] dp = new int[nums.length];

        // 初始化dp数组
        Arrays.fill(dp,1);

        // 推导dp数组
        for (int i = 1; i < dp.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i],dp[j] + 1);
                }
            }
        }

        // 获取dp数组的最大值
        int result = 0;
        for (int num : dp) {
            result = Math.max(result,num);
        }

        return  result;
    }
}

674. 最长连续递增序列

题目链接:力扣

思路

        其实这道题比上一道题目简单很多,明白了上一道题目,这道题目就很简单了

        不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关

最长连续递增序列

动态规划

class Solution {
    public int findLengthOfLCIS(int[] nums) {

        // 创建dp数组
        int[] dp = new int[nums.length];

        // 初始化dp数组
        Arrays.fill(dp,1);

        // 推导dp数组
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > nums[i-1]) {
                dp[i] = dp[i - 1] + 1;
            }
        }

        // 收获结果
        int result = 0;
        for (int num : dp) {
            result = num > result ? num : result;
        }

        return  result;
    }
}

贪心算法

class Solution {
    public int findLengthOfLCIS(int[] nums) {

        // 结果收集
        int result = 1;

        // 记录长度
        int count = 1; 

        for (int i = 1; i < nums.length; i++) {

            if (nums[i] > nums[i - 1]) {
                count++;
            } else {
                count = 1;
            }

            result = count > result ? count : result;
        }

        return  result;
    }
}

718. 最长重复子数组

题目链接:力扣

思路

        子数组,其实就是连续子序列

        这道题目确实不太好理解,可以看看这个图:力扣

1、确定dp数组的含义

        dp[i][j] : 以下标 i - 1为结尾的 A ,和下标为 j - 1为结尾的 B,最长重复子数组长度为dp[i][j]

2、确定递推公式

        dp[i][j] = dp[i - 1][j - 1] + 1

        这个递推公式确实不太好理解,可以把这道题目看成上一道题目的延申,这样就会发现这两个递推公式的相同之处,求连续的子序列,只跟前一个状态有关

3、dp数组初始化

        初始化为0

4、遍历顺序

        二维dp数组的内层循环和外层循环都是从前向后进行遍历

        一维dp数组的内层循环时从后向前进行遍历,因为计算当前值 依赖的是 其左上角的值,如果从前向后进行遍历,前面的结果有可能被覆盖掉了,后面就不能得到准确的值了

最长重复子数组

二维dp数组

// 写法一
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        
        // 创建dp数组
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];

        // 初始化dp数组
        // 与默认值相符,不用初始化了

        int result = 0;

        // 推导dp数组
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = 1; j <= nums2.length; j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }

                result = dp[i][j] > result ? dp[i][j] : result;
            }
        }

        return result;
    }
}



// 写法二
class Solution {
    public int findLength(int[] nums1, int[] nums2) {

        int result = 0;

        // 创建dp数组
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];

        // 推导dp数组
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j]) {
                    dp[i + 1][j + 1] = dp[i][j] + 1;
                }

                result = Math.max(result,dp[i+1][j+1]);
            }
        }

        return  result;

    }
}

一维dp数组

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        
        // 创建dp数组
        int[] dp = new int[nums1.length + 1];

        // 初始化dp数组
        // 与默认值相符,不用初始化了

        int result = 0;

        // 推导dp数组
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = nums2.length; j > 0; j--) {   // 注意遍历顺序
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[j] = dp[j - 1] + 1;
                } else {
                    dp[j] = 0;   // 注意 不相等的时候要重新赋值
                }

                result = dp[j] > result ? dp[j] : result;
            }
        }

        return result;
    }
}

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

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

相关文章

docker 命令

目录 Docker 环境信息命令 docker info docker version 系统日志信息常用命令 docker events docker logs docker history 容器的生命周期管理命令 docker create docker run 常用选项 系统 网络 健康检查 命名空间选项 cgroup资源限制选项 CPU CPUset devi…

李宏毅《DLHLP》学习笔记7 - Voice Conversion 1

视频链接&#xff1a;https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现(二)

文章目录前言一、SVPWM二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析三、永磁同步电机恒压频比开环控制系统代码生成及工程实现3.1.恒压频比开环控制算法代码生成3.2.仿真验…

计算机毕业论文Java项目源码下载基于SSM的旅游资讯网站含前台与后台

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssm地方旅游资讯网站》该项目采用技术&#xff1a;jsp 、springmvc、spring、mybatis 、css、js、jQuery、bootstrap、easyui等相关技术&#x…

在云服务器上部署jupyter服务器环境(with conda-forge)

tags: Python Conda Tips Server 写在前面 最近想折腾点服务器的新花样(总是空着太可惜了), 想到前阶段配置的jupyter, 发现这不就能部署在服务端吗?还不走流量的那种(指安装包时候), 话不多说, 开整! 下面的用户名以及组都是test, 用于测试. 大家需要改成自己的用户名. 安装…

【Nginx】负载均衡、动静分离理论篇

一、负载均衡 1. 应用场景&#xff1a; 2. 负载均衡是什么&#xff1f; 在当业务系统服务器无法支撑当前的业务量时&#xff0c;用户可以选择更高性能的服务器。 但更为合理的做法是通过在既有业务服务器基础上&#xff0c;增量的方式增加相同功能的服务器&#xff0c;将处理…

Linux操作系统(基础操作)

文章目录一、文件操作命令1. 目录和文件操作2. 查看文件内容3. 重定向4. 管道二、信息系统相关命令1. 查看系统进程 -- ps2. 查看系统监听端口 -- netstat3. 查看日志信息命令 -- head / tail三、用户权限和管理1. linux中的权限2.修改用户权限chmod3.增加用户、查看登录用户4.…

CAS-比较并交换

CAS-比较并交换 原子类 何为原子类 没有CAS之前 多线程环境不使用原子类保证线程安全i&#xff08;基本数据类型&#xff09; 常用synchronized锁&#xff0c;但是它比较重 &#xff0c;牵扯到了用户态和内核态的切换,效率不高。 public class T3 {volatile int number 0…

JMeter 进行函数助手MD5加密

JMeter 函数助手 MD5 加密 JMeter函数助手中&#xff0c;提供了MD5加密的方法&#xff0c;如图所示&#xff0c;我们将内容 “123456”进行加密&#xff0c;可以看到加密成功了。 下面我们来看看项目接口的请求参数。 这是一个认证接口&#xff0c;我们可以看到请求的参数中包…

MySQL-MVCC多版本控制及事务的隔离性

MySQL事务的启动方式 隐式&#xff1a;执行SQL语句自动提交&#xff08;前提MySQL使用SET AUTOCOMMIT1开启自动提交&#xff09;显式&#xff1a;begin/start transaction; update user set username timi where id 1; commit; begin/start transaction命令并不是一个事务的起…

UE获取当前鼠标点击位置坐标

文章目录 1. 实现目标2. 实现过程2.1 蓝图代码2.2 实现思路3. 参考资料1. 实现目标 获取当前鼠标点击位置的UE世界坐标(x,y,z),效果如下图所示(为便于演示,下图显示了碰撞点位)。 2. 实现过程 2.1 蓝图代码 (1)核心函数的蓝图代码如下: (2)当鼠标左键按下时,…

【✨十五天搞定电工基础】一阶电路的暂态分析

本章要求1. 了解电阻元件、电感元件与电容元件的特征; 2. 理解电路的暂态和稳态、零输入响应、零状态响应、全响应的概念&#xff0c;以及时间常数的物 理意义; 3. 掌握换路定则及初始值的求法; 4. 掌握一阶线性电路分析的三要素法。 目录 一、一阶电路和换路定律 1…

第十四章 图的存储及图的DFS(超级详细!!逐行解析!!)

第十四章 图的存储及图的DFS一、图1、什么是图&#xff1f;2、图的存储&#xff08;1&#xff09;邻接矩阵&#xff08;2&#xff09;邻接表二、图的深度优先搜索1、思路2、模板&#xff08;1&#xff09;问题&#xff1a;如何求左右子树呢?什么时候记录呢&#xff1f;如何构造…

数字孪生场景、代码即开即用 | 图观™引擎 超详细功能范例演示

数字孪生已经从一项前沿技术&#xff0c;演变成为各行各业数字化转型的必选项。 过去想要构建数字孪生应用&#xff0c;要面对视觉设计、三维底座构建、代码开发、数据对接、部署联调等一系列复杂工作。不仅要了解复杂的数学基础知识、底层三维开发技术&#xff0c;还要熟知各…

Spring Cloud微服务迁移到Kubernetes容器化

文章目录相关文章k8s容器部署流程熟悉Spring Cloud微服务项目源代码编译构建构建项目镜像并推送到镜像仓库制作镜像将镜像推送到harbor仓库K8s服务编排部署基础环境在K8s中部署Nacos集群&#xff08;注册和配置中心&#xff09;在k8s中部署Seata分布式事务在linux部署mysql,red…

李炎恢ECMAScript6 / ES6+(二)

16.Set 数据集合 学习要点&#xff1a; 1.Set 数据集合 本节课我们来开始学习 ES6 新增的 Set 数据集合的用法&#xff1b; 一&#xff0e;Set 数据集合 1.ES6 之前只有数组一种数据结构&#xff0c;而现在提供了 Set 和 Map 两种集合&#xff1b; 严格来说&#xff0c;对象…

PC辉光效果一切正常,安卓辉光却没效果、显示异常(爆闪、黑屏等)

一&#xff1a;安卓端辉光不显示问题 问题描述&#xff1a;项目中使用unity的PostProcessing package实现辉光的功能&#xff0c;在pc上辉光效果一切正常&#xff0c;但是打出apk在真机测试时&#xff0c;辉光基本没效果。 解决思路&#xff1a;PostProcessing Bloom效果需要有…

【ArcGIS微课1000例】0056:将单波段栅格背景设置为无数据NoData的方法

本文讲解将单波段栅格背景设置为空值的方法,以DEM数据为例。 文章目录 一、DEM设置无数据二、注意事项单波段数据,一般只有DEM,遥感单波段影像,二值化图像等。 使用珊格计算器通过SetNull 函数(设定空值函数)可以将特定值计算为空值(NoData),SetNull的语法格式为: Se…

[附源码]Python计算机毕业设计Django教育企业网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

4-5:关注,取消关注

需求 开发关注、取消关注功能。 统计用户的关注数、粉丝数。 关键 若A关注了B&#xff0c;则A是B的Follower (粉丝)&#xff0c;B是A的Followee (目标)。关注的目标可以是用户、帖子、题目等&#xff0c;在实现时将这些目标抽象为实体。 也是将数据存储到redis中&#xff0c;…