day52最长递增子序列_最长连续递增序列_最长重复子数组

news/2025/2/7 8:41:01/

力扣300.最长递增子序列

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/

思路

dp数组的含义

dp[i]表示,以nums[i]结尾的最长递增子序列长度

递推公式

假设j在i的前面,如果nums[j]<nums[i],那么dp[i]至少是dp[j]+1

让j遍历[0,i)的所有元素,位置i的最长递增子序列等于j从0到i-1各个位置的最长递增子序列 + 1 的最大值,即dp[i] = Math.max(dp[j] + 1,dp[i])

初始化

dp[i]最起码长度为1(自身)

遍历顺序

i必须从前向后遍历,因为要利用在它之前的j的值。

j不论从前向后还是从后向前遍历都行,只需要遍历完[0,i)的元素即可。

打印数组

这里要注意不是dp[nums.length-1],因为最长子序列不一定是在最后一个元素那里取到。所以要遍历整个nums[i],找到最大值。

完整代码

class Solution {public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];Arrays.fill(dp,1);dp[0] = 1;int result = 1;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[j] + 1,dp[i]);}}result = Math.max(result,dp[i]);}return result;}
}

力扣674.最长连续递增序列

题目链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/
##思路
本题和最长递增子序列不同的点就是:要求连续

递推公式

只需要判断nums[i-1]和nums[i]是不是递增的关系,是递增关系,dp[i] = dp[i-1] + 1。不是递增关系,就保持初始值,即为1。

完整代码

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

力扣718.最长重复子数组

题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/

思路

dp数组含义

dp[i][j]表示:以nums1[i-1]为结尾,nums2[j-1]为结尾的最长重复子数组

递推公式

匹配到nums1[i-1]==nums2[j-1]时,有dp[i][j] = dp[i-1][j-1] + 1。

这里为什么匹配到i-1和j-1可以得出dp[i][j]的公式呢?

因为在dp数组的定义中,dp[i][j]表示的就是以nums1[i-1]为结尾,nums2[j-1]为结尾的最长重复子数组。

那么为什么是dp[i][j] = dp[i-1][j-1] + 1呢?

因为匹配时,两个数组必须同时回退一格,不能nums1退一格,nums2不退。

初始化

由于我们对dp数组的定义,所以导致dp[0][j]和dp[i][0]是没有意义的,因为dp[i][j]是需要1个1个累加的,所以为了方便,我们将dp数组全部初始化为0.

遍历顺序

两个数组都是从前向后遍历,需要注意的是:i <= nums1.length,这里等号是能取到的,因为我们对dp数组的定义是i-1和j-1。那么同时,dp数组初始化的大小应该涵盖到nums1.length+1

打印数组

这和之前两题类似,不一定会在数组最后一个元素取到最大值,需要遍历整个数组,得到最大值。

完整代码

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

http://www.ppmy.cn/news/21157.html

相关文章

设计师都在用的5个设计素材库

作为一名设计师推荐几个设计素材网站&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky 站内平面海报、UI设计、电商淘宝、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能&#xff0c;能有效的为设计师节省找素材时…

【浪漫情人节】送你Python表白神器,祝天下有情人终成眷属

哈哈哈再过十几天就到了一年一度的情人节啦&#xff01;如此浪漫的日子&#xff0c;小王决定用Python写一个简单的表白神器送给大家&#xff0c;祝天下有情人终成眷属&#xff01; 目录 前言 一、Turtle小海龟 1. 基本函数 2. 漂浮爱心 二、Tkinter界面设计 1. 基本…

SLAM数学知识回顾

文章目录1、三角函数2、向量运算&#xff08;1&#xff09;负向量&#xff08;2&#xff09;向量的模&#xff08;3&#xff09;标量与向量的运算&#xff08;4&#xff09;标准化向量&#xff08;5&#xff09;向量的加法和减法&#xff08;6&#xff09;距离公式&#xff08;…

基于Java+SpringBoot+vue+element驾校管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

快来看啊,2023成都Java培训机构排行榜出来啦!

来啦&#xff0c;来啦&#xff01;我带着2023成都最新Java培训机构排行榜来啦。不知道怎么选择一个好的Java培训机构&#xff1f;停止寻觅&#xff0c;别再犹豫&#xff0c;看我这一篇就够啦&#xff01;一、成都动力节点动力节点&#xff0c;09年成立&#xff0c;14年来只专注…

RK3588平台开发系列讲解(进程篇)进程的处理器亲和性

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、简介二、相关结构体三、函数接口四、cpuset的使用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇介绍进程的处理器亲和性相关知识。 一、简介 Linux进程调度器为了充分利用CPU资源,会将进程在不同的…

HTML简介

目录 一、HTML基础知识 二、HTML常见标签 注释标签 标题标签 段落标签 常用的转义字符 换行标签 格式化标签 图片标签 超链接标签 表格标签 列表标签 input标签 文本框 密码框 单选框 复选框 普通按钮 选择文件 下拉标签 多行文本输入 无语…

C++的三大特性之继承

目录 一 继承的概念 代码&#xff1a; 总结&#xff1a; 二 继承中的关系 三 继承中的作用域问题 什么是域&#xff1f; 隐藏&#xff1a; 隐藏的场景&#xff1a; 总结 四 赋值兼容原则 什么是赋值兼容原则&#xff1f; 与平时强制类型转换的区别 这一个赋值兼容原则…