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

news2024/10/1 21:30:11

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

300. 最长递增子序列

题目:

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

思路:

  1. dp[i]的定义

dp[i]表示i之前包括i的以nums[i]结尾最长上升子序列的长度

  1. 状态转移方程

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

所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值

  1. dp[i]的初始化

每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是1.

  1. 确定遍历顺序

dp[i] 是有0到i-1各个位置的最长升序子序列 推导而来,那么遍历i一定是从前向后遍历。

j其实就是0到i-1,遍历i的循环在外层,遍历j则在内层,代码如下:

for (int i = 1; i < nums.size(); i++) {
    for (int j = 0; j < i; j++) {
        if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
    }
    if (dp[i] > result) result = dp[i]; // 取长的子序列
}
  1. 举例推导dp数组

输入:[0,1,0,3,2],dp数组的变化如下:

300.最长上升子序列

代码:

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];
        for(int i = 0; i < nums.length; i++){
            dp[i] = 1;
        }
        int result = 1;
        for(int i = 1; i < nums.length; i++){
            for(int j = 0; j < i; j++){
                if(nums[j] < nums[i]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    if(dp[i] > result) result = dp[i];
                }
            }
        }
        return result;
    }
}

674. 最长连续递增序列

题目:

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

思路:

  1. 确定dp数组(dp table)以及下标的含义

dp[i]:以下标i为结尾的数组的连续递增的子序列长度为dp[i]

注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。

  1. 确定递推公式

如果 nums[i + 1] > nums[i],那么以 i+1 为结尾的数组的连续递增的子序列长度 一定等于 以i为结尾的数组的连续递增的子序列长度 + 1

即:dp[i + 1] = dp[i] + 1;

因为本题要求连续递增子序列,所以就必要比较nums[i + 1]与nums[i],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。

既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i + 1] 和 nums[i]。

这里大家要好好体会一下!

  1. dp数组如何初始化

以下标i为结尾的数组的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。

所以dp[i]应该初始1;

  1. 确定遍历顺序

从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。

本文在确定递推公式的时候也说明了为什么本题只需要一层for循环,代码如下:

for (int i = 0; i < nums.size() - 1; i++) {
    if (nums[i + 1] > nums[i]) { // 连续记录
        dp[i + 1] = dp[i] + 1; // 递推公式
    }
}
  1. 举例推导dp数组

已输入nums = [1,3,5,4,7]为例,dp数组状态如下:

674.最长连续递增序列

代码:

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int[] dp = new int[nums.length];
        for(int i = 0; i < nums.length; i++){
            dp[i] = 1;
        }
        int result = 1;
        for(int i = 1; i < dp.length; i++){
            if(nums[i] > nums[i - 1]){
                dp[i] = dp[i - 1] + 1;
                if(dp[i] > result) result = dp[i];
            }
        }
        return result;
    }
}

718. 最长重复子数组

题目:

给两个整数数组 nums1nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。

思路:

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )

此时细心的同学应该发现,那dp[0][0]是什么含义呢?总不能是以下标-1为结尾的A数组吧。

其实dp[i][j]的定义也就决定着,我们在遍历dp[i][j]的时候i 和 j都要从1开始。

那有同学问了,我就定义dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度。不行么?

行倒是行! 但实现起来就麻烦一点,大家看下面的dp数组状态图就明白了。

  1. 确定递推公式

根据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开始!

  1. dp数组如何初始化

根据dp[i][j]的定义,dp[i][0] 和dp[0][j]其实都是没有意义的!

但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;

所以dp[i][0] 和dp[0][j]初始化为0。

举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。

  1. 确定遍历顺序

外层for循环遍历A,内层for循环遍历B。

那又有同学问了,外层for循环遍历B,内层for循环遍历A。不行么?

也行,一样的,我这里就用外层for循环遍历A,内层for循环遍历B了。

同时题目要求长度最长的子数组的长度。所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

代码如下:

for (int i = 1; i <= A.size(); i++) {
    for (int j = 1; j <= B.size(); j++) {
        if (A[i - 1] == B[j - 1]) {
            dp[i][j] = dp[i - 1][j - 1] + 1;
        }
        if (dp[i][j] > result) result = dp[i][j];
    }
}
  1. 举例推导dp数组

拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下:

718.最长重复子数组

代码:

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        int result = 0;
        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;
                    if(dp[i][j] > result) result = dp[i][j];
                }
            }
        }
        return result;
    }
}

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

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

相关文章

2022年NPDP新版教材知识集锦--【第四章节】(6)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行&#xff0c;新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总&#xff0c;包括详细设计与规格阶段相关内容&#xff0c;快来看看吧。 【制造与装配阶段】(全部获取文末) …

SAP-ABAP-企业微信:ZCSM37-后台JOB异常检查主动推送企业微信群

场景&#xff1a;异常JOB主动推送企业微信群 &#xff08;企业微信机器人可百度创建&#xff0c;注意群不能有企业外的人员&#xff0c;否则接口无效&#xff09; 事务代码&#xff1a;ZSM37_CHECK程序名称&#xff1a;ZSM37_CHECK程序目的&#xff1a; ZCSM37-后台JOB异常检…

Java+JSP+MySQL基于SSM的物流公司物流订单管理系统-计算机毕业设计

项目介绍 随着我国经济的高速增长&#xff0c;物流快递的数量也在不断的增加&#xff0c;同时面临的就是如何更加方便快捷和高效的管理物流订单的问题&#xff0c;传统模式的物流订单管理模式明显已经不能够满足当下的需求&#xff0c;于是我们提出了基于B/S的贴心物流公司物流…

Redis未授权漏洞利用

1、背景介绍 近期公司内部安装主机安全组件&#xff0c;检测出一些安全漏洞&#xff0c;其中就有利用redis未授权漏洞进行攻击。 2、攻击原理 正常redis默认情况下&#xff0c;会绑定在0.0.0.0:6379&#xff0c;如果没有限制来源IP并且甚至没有密码&#xff0c;那么就会导致…

举个栗子~Minitab 技巧(5):掌握常用快捷键,提高统计分析效率

在日常使用 Minitab 时&#xff0c;大部分小伙伴的习惯是使用鼠标进行点击和拖拽等操作。然而&#xff0c;在使用频率很高的情况下&#xff0c;这种方式会带来很多重复且低效的劳动。 其实&#xff0c;Minitab 软件内置了许多快捷键&#xff0c;可以快速实现新建、打开、保存、…

虹科分析 | 终端安全 | 移动目标防御是“变革性”技术——GARTNER

使用前Gartner连续第二年将移动目标防御&#xff08;MTD&#xff09;作为特色技术&#xff0c;并将Morphisec作为该技术的样本供应商&#xff0c;在其报告《新兴技术影响雷达&#xff1a;安全》中。作者将MTD定义为“…一种技术趋势&#xff0c;其中动态或静态排列变形、转换或…

sentinel中流控规则 并发线程数的实战理解

先看下官网文档关于并发线程数的解释&#xff1a;链接地址 public class FlowThreadDemo {private static AtomicInteger pass new AtomicInteger();private static AtomicInteger block new AtomicInteger();private static AtomicInteger total new AtomicInteger();priva…

linux_mysql安装教程带安装包(亲测有效)

文章目录1.检查当前系统是否安装mysql2.上传mysql安装包/opt/software目录下3.解压安装包4.在安装目录下执行rpm安装5.删除/etc/my.cnf文件中datadir指向的目录下所有内容&#xff0c;6.初始化数据库7.查看临时生成的root用户密码8.启动mysql服务9.登陆mysql数据库10.修改root用…

Fiddler导出JMeter脚本插件原理

目录 一、Fiddler导出JMeter脚本插件原理 二、Fiddler导出JMeter脚本插件的基本使用 结语 一、Fiddler导出JMeter脚本插件原理 既然JMeter本质上是一个xml文档&#xff0c;Fiddler可以抓取HTTP请求包&#xff0c;插件的基本原理就是Fiddler抓取HTTP请求包将HTTP请求信息通过…

【电商项目实战】修改密码(详细篇)

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;SpringBoot电商项目实战 ✨学习社区&#xff1a; &#x1f449;不会压弯的小飞侠 ✨知足上进&#x…

乾元通4G/5G多链路聚合设备在公共安全通信方面解决方案

政府部门对应急指挥系统提出了更高的要求&#xff0c;在特殊情况下需要能够迅速建立紧急指挥中心&#xff0c;通过应急指挥系统统一协调、统一调度相关部门协同工作&#xff0c;达到“及时了解&#xff0c;快速反应&#xff0c;准确决策&#xff0c;统一调度&#xff0c;妥善处…

面试半年,上个月成功拿到阿里offer,全靠我啃烂了学长给的这份笔记

前言 不论是校招还是社招都避免不了各种⾯试、笔试&#xff0c;如何去准备这些东⻄就显得格外重要。不论是笔试还是⾯试都是有章可循的&#xff0c;我这个“有章可循”说的意思只是说应对技术⾯试是可以提前准备&#xff0c;所谓不打无准备的仗就是这个道理。 以下为大家&…

牛血清白蛋白修饰葡萄糖 BSA-glucose,木糖/半乳糖/乳糖偶联牛血清白蛋白

产品名称&#xff1a;牛血清白蛋白修饰葡萄糖 英文名称&#xff1a; BSA-glucose 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白&…

创作纪念日 编程练习 - 斐波那契数列

文章目录我的第一次今日份练习| 斐波那契数列憧憬我的第一次 第一次浏览CSDN的时候刚开始学C的时候&#xff0c;当时的课设是《C & SQL 2008的学生管理系统》&#xff0c;C作前段界面、逻辑处理&#xff0c;SQL作为后端服务器支持的题目&#xff0c;当时不太认真学习&…

化纤企业净利润下滑,纺织企业如何利用APS排产减轻盈余压力

根据国家统计局数据&#xff0c;2022年前三季度&#xff0c;全国规模以上纺织企业工业增加值同比减少0.4%&#xff0c;营业收入同比增长3.1%&#xff0c;利润总额同比减少23.6%&#xff0c;增速均较上年同期有所放缓。 从全产业链看&#xff0c;中下游印染、长丝织造、服装等分…

Qt之读写文件

1.思路 读写文件的基本操作&#xff1a; 读文件 写文件 打开文件 打开文件 读取文件 写入文件 关闭文件 关闭文件 2.QFile实现读写文件 QFile类提供读写文件的接口。 它的构造函数如下&#xff1a; QFile(const QString & name) QFile(QObject * parent) QFile(c…

点击化学 PEG 试剂:1802907-92-1,Mtz-PEG4-NHS,甲基四嗪-四聚乙醇-活性酯

【中文名称】甲基四嗪-四聚乙醇-活性酯 【英文名称】 Methyltetrazine-PEG4-NHS ester&#xff0c;Mtz-PEG4-NHS 【结 构 式】 【CAS号】1802907-92-1 【分子式】C24H31N5O9 【分子量】533.54 【基团部分】Methyltetrazine 【纯度标准】95% 【包装规格】5g&#xff0c;10g&…

安卓有哪些耳机好用?好用的安卓蓝牙耳机推荐

市面上的蓝牙耳机五花八门&#xff0c;许多消费者在选购的时候不知道如何选择&#xff0c;除了苹果以外&#xff0c;其他的都要细心参考一下&#xff0c;由于苹果耳机市场的价格昂贵&#xff0c;不少的人选择其他品牌的替代&#xff0c;作为一位追求性价比的消费者而言&#xf…

HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Dubbo底层网络连接模型

在Dubbo中&#xff0c;有两个参数⽤来配置服务消费者和服务提供者直接的socket连接个数&#xff1a; shareconnections&#xff1a;表示可共享的socket连接个数connections&#xff1a;表示不共享的socket连接个数 服务A的shareconnections为2时&#xff0c;服务A的消费者会向…