代码随想录算法训练营第43天|LeetCode 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

news2025/1/23 21:20:49

1. LeetCode 300.最长递增子序列

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/
文章链接:https://programmercarl.com/0300.最长上升子序列.html
视频链接:https://www.bilibili.com/video/BV1ng411J7xP

在这里插入图片描述

思路:
1.dp[i]的定义
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
2.递推公式
位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
注意:这里前提是nums[i] > nums[j],只有这种情况,才能使用dp[j]+1,更新dp[i];也就是说,从0到i-1位置也存在nums[i] <= nums[j]的情况,这时就不考虑以该j位置结尾的最长子序列的长度了dp[j];
3.初始化
每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.
4.确定遍历顺序
dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。
j遍历0到i-1,那么是从前到后,还是从后到前遍历都无所谓,只要把0 到 i-1 的元素都遍历了就行了。 所以默认习惯 从前向后遍历。
遍历i的循环在外层,遍历j则在内层。
5.返回值
dp数组中的最大值

解法:
class Solution {
    public int lengthOfLIS(int[] nums) {
        //1.定义dp数组
        //dp[i]表示下标i之前(包括i)的以nums[i]结尾的最长递增子序列长度
        int[] dp = new int[nums.length];
        //2.递推公式
        /**
        if (nums[i] > nums[j]) {
            dp[i] = Math.max(dp[i],dp[j]+1);
        }
         */
         //3.初始化
         for (int i=0;i<nums.length;i++) {
            dp[i] = 1;
         }
         //4.遍历顺序
         int res = dp[0];
         for (int i=1;i<nums.length;i++) {
            for (int j=0;j<i;j++) {
                if (nums[i]>nums[j]) {
                    dp[i] = Math.max(dp[i],dp[j]+1);
                }
            }
            if (dp[i]>res) {
                res = dp[i];
            }
         }

         return res;
    }
}

2. LeetCode 674. 最长连续递增序列

题目链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/
文章链接:https://programmercarl.com/0674.最长连续递增序列.html#思路
视频链接:https://www.bilibili.com/video/BV1bD4y1778v

在这里插入图片描述

思路:
1.确定dp数组(dp table)以及下标的含义
dp[i]:dp[i]表示下标i之前(包括i)以nums[i]结尾的最长连续递增子序列的长度。
注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。
2.确定递推公式
如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。
即:if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;
因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。
3.dp数组如何初始化
以下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。
所以dp[i]应该初始1;
4.确定遍历顺序
从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。
5.返回值
dp数组中的最大值

解法:
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        //1.定义dp数组
        //dp[i]表示下标i之前(包括i)以nums[i]结尾的最长连续递增子序列的长度
        int[] dp = new int[nums.length];
        //2.递推公式
        /**
        if (nums[i]>nums[i-1]) {
            dp[i] = dp[i-1]+1;
        }
         */
        //3.初始化
        for (int i=0;i<nums.length;i++) {
            dp[i] = 1;
        }
        //4.遍历顺序 从前往后
        int res = dp[0];
        for (int i=1;i<nums.length;i++) {
            if (nums[i]>nums[i-1]) {
                dp[i] = dp[i-1]+1;
            }
            res = Math.max(res,dp[i]);
        }

        return res;
    }
}

3. LeetCode 718. 最长重复子数组

题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
文章链接:https://programmercarl.com/0718.最长重复子数组.html
视频链接:https://www.bilibili.com/video/BV178411H7hV

在这里插入图片描述

思路:
1.确定dp数组(dp table)以及下标的含义
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。
int[][] dp = new int[nums1.length+1][nums2.length+1];
特别注意:
“以下标i - 1为结尾的A” 表明一定是以A[i-1]为结尾的字符串。
在遍历dp[i][j]的时候i 和 j都要从1开始。
2.确定递推公式
根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。
即:当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
根据递推公式可以看出,遍历i 和 j 要从1开始!
3.dp数组如何初始化
dp[i][0] 和dp[0][j]初始化为0。
4.确定遍历顺序
外层for循环遍历A,内层for循环遍历B。
5.返回值
dp数组中的最大值

解法:
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        //1.定义dp数组
        //dp[i][j]表示以下标i-1结尾的子串a和以下标j-1结尾的子串b的公共最长子数组的长度
        int[][] dp = new int[nums1.length+1][nums2.length+1];
        //2.递推公式
        /**
        if (nums1[i-1]==nums2[j-1]) {
            dp[i][j] = dp[i-1][j-1] + 1;
        }
         */
        //3.初始化
        //4.遍历顺序
        int res = 0;
        for (int i=1;i<nums1.length+1;i++) {
            for (int j=1;j<nums2.length+1;j++) {
                if (nums1[i-1]==nums2[j-1]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                }

                res = Math.max(res,dp[i][j]);
            }
        }

        return res; 
    } 
}

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

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

相关文章

进阶SpringBoot之 Spring 官网或 IDEA 快速构建项目

SpringBoot 就是一个 JavaWeb 的开发框架&#xff0c;约定大于配置 程序 数据结构 算法 微服务架构是把每个功能元素独立出来&#xff0c;再动态组合&#xff0c;是对功能元素的复制 这样做可以节省调用资源&#xff0c;每个功能元素的服务都是一个可替代、可独立升级的软…

从地铁客流讲开来:超一线城市的客运量特征

这篇我们把视角聚焦在四大超一线城市&#xff0c;北上广深&#xff0c;我们来看看这些城市地铁客运量的异同&#xff0c;这里放一个背景2024年6月8日—6月10日是我国农历的端午节&#xff0c;我们看图说话&#xff0c;相同的特征&#xff1a;1.四大一线城市客流都在周五达到客运…

数学建模--蒙特卡罗随机模拟

目录 蒙特卡罗方法的基本原理 蒙特卡罗方法在优化中的应用 蒙特卡罗方法的优势与局限 优势 局限 典型应用案例 Python代码示例 ​编辑 结论 蒙特卡罗方法在数学建模中的具体应用案例有哪些&#xff1f; 如何改进蒙特卡罗方法以提高计算效率和精度&#xff1f; 蒙特…

如何使你的mermaid流程图里的某一段文字加粗、变斜、成为上下标……

目录 参考的链接开头1.加粗&#xff0c;*斜体*与下划线2.标记,~~删除线~~与^上^~下~标3.代码片与标题4.注释与蓝色链接5.其</q>他 东西 结尾 参考的链接 HTML标签列表(按字母排序)和HTML标签列表(按功能排序) 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们…

【架构】客户端优化

这篇文章总结一下服务器网关及之前部分的优化&#xff0c;如客户端的优化&#xff0c;CDN/DNS等。 这里我们先谈一谈客户端缓存优化的手段。一般我们后端在说到缓存&#xff0c;第一时间想到的往往是redis&#xff0c;其实缓存在架构层次还有很多其他可以实现的地方&#xff0…

从LLM到大模型推理的最新进展

大语言模型LLM的推理引擎经过一年时间发展&#xff0c;现在主流方案收敛到了开源的vLLM和半闭源的TensorRT-LLM。 TRT-LLM基于C开发&#xff0c;有NV算子开发黑魔法加持&#xff0c;在其重点支持的场景里&#xff0c;性能可以做到极致。vLLM基于python开发&#xff0c;代码简洁…

MySQL第2讲--关系型数据库以及SQL语句分类之DDL数据库和表的操作

文章目录 前言关系型数据库&#xff08;RDBMS&#xff09;关系型数据库的特点 MySQL数据模型SQL介绍基本语法规则SQL语句的分类DDL的介绍DDL的数据库操作DDL的表操作 前言 上一节MySQL第1讲–详细安装教程和启动方法中介绍了MySQL如何安装&#xff0c;以及如何启动和客户端连接…

使用 Elastic 和 Mistral 构建多语言 RAG

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Elastic 和 Mixtral 8x22B 模型构建多语言 RAG 应用程序。 Mixtral 8x22B 是性能最高的开放式模型&#xff0c;其最强大的功能之一是能够流利使用多种语言&#xff1b;包括英语、西班牙语、法语、意大利语和德语。 想象一…

质量属性-系统架构师(四十)

质量属性 1性能&#xff1a; 指系统响应能力。如响应时间、吞吐量。 设计策略&#xff1a;优先级队列&#xff0c;增加计算机资源&#xff0c;减少计算机开销&#xff0c;引入并发机制&#xff0c;采用资源调度。 2可靠性&#xff1a; 在一定时间内正常运行的情况下&#x…

PTA—基础编程题目集(7-21)

7-21 求特殊方程的正整数解 目录 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 输入样例1&#xff1a; 输出样例1&#xff1a; 输入样例2&#xff1a; 输出样例2&#xff1a; 参考代码 总结 题目描述 本题要求对任意给定的正整数N&#xff0c;求方程X2Y2N的…

《Milvus Cloud向量数据库指南》——关于Ivy.ai:重塑沟通效率与数据安全的创新先锋

关于Ivy.ai:重塑沟通效率与数据安全的创新先锋 在数字化转型的浪潮中,Ivy.ai以其前瞻性的视野和专业团队的匠心独运,正逐步成为高等教育、医疗保健及公共部门沟通效率提升的引领者。这家企业不仅代表了人工智能技术在服务领域的最新进展,更以其旗舰产品IvyQuantum™的横空…

搬瓦工香港CMI VPS测评

搬瓦工香港cmi怎么样&#xff1f;搬瓦工香港VPS分CN2 GIA和CMI两种不同接入的网络&#xff0c;其中CMI网络的回程是强制三网全部都走移动CMI线路&#xff0c;相对CN2 GIA来说有一定的差距。实际的情况测评数据送上&#xff0c;可供参考。 CPU型号未知&#xff0c;主频2.7GHz&a…

【C++】一堆数组 冒泡排序

冒泡排序&#xff0c;一种很常见的排序法师 这章要划重点&#xff0c;很重要&#xff01;&#xff01; 排序思路为前一个元素与后一个元素比大小&#xff0c;一直循环一轮&#xff0c;找出最大/最小的那个元素后&#xff0c;进行下一轮&#xff0c;找到第二大/小的元素......…

ZLM推流

ZLM推流 ffmpeg -re -i D:\work\gb28181-client\target\classes\device\videofile.h264 -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000把这个复制出来然后将defaultVhost_改成127.0.0.1

题海战术,面试必胜秘诀

目录 1.Java 的优势是什么&#xff1f;2.什么是 Java 的多态特性?3.Java 中的参数传递是按值还是按引用?4.为什么 Java 不支持多重继承?5.什么是 Java 中的不可变类?总结 题目 来自面试鸭刷题神器 1.Java 的优势是什么&#xff1f; Java 的跨平台性、垃圾回收机制以及其强…

【EtherCAT】Windows+Visual Studio配置SOEM主站——源码配置

目录 一、准备工作 1. Visual Studio 2022 2. Npcap 1.79 3. SOEM源码 二、源码部署 1. 新建Visual Studio工程 2. 创建文件夹 3. 创建主函数 4. 复制源代码 5. 删除无关项 6. 将soem源码添加进工程 7. 添加soem头文件 8. 配置头文件路径 9. 配置静态库和静态库路…

xdma的linux驱动编译给arm使用(中断检测-测试程序)

1、驱动链接 XDMA驱动源码官网下载地址为&#xff1a;https://github.com/Xilinx/dma_ip_drivers 下载最新版本的XDMA驱动源码&#xff0c;即master版本&#xff0c;否则其驱动用不了&#xff08;xdma ip核版本为4.1&#xff09;。 2、驱动 此部分来源于博客&#xff1a;xd…

多模态MLLM都是怎么实现的(12)-Florence-2

最近一直在打艾尔登法环DLC&#xff0c;疏于更新了&#xff0c;罪过罪过&#xff0c;今天把拉塔恩给过了&#xff0c;也该更新了&#xff0c;停更期间&#xff0c;催更的信息主要是啥时候更新GPU系列的第五篇&#xff0c;不是不更&#xff0c;是刚打完&#xff0c;正好有客户要…

C# Unity 面向对象补全计划 七大原则 之 里氏替换

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;尤其是关于继承的两篇文章&#xff…