代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言

本期我们来解决动规的经典题型------  子数组问题

我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲

1.明确dp数组含义

2.明确dp数组如何推导-递推公式

3.初始化dp数组

4.确定遍历顺序

5.打印dp数组排错

LeetCode T300 最长递增子序列

题目链接:300. 最长递增子序列 - 力扣(LeetCode)

题目思路:

1.明确dp数组含义

这里的dp[i]表示的是以dp[i]为结尾的最长递增子序列的长度

2.明确dp数组如何推导-递推公式

我们知道这里的递增不要求连续,只需要位置在i前面即可,所以我们定义一个j来遍历i前面的元素,这里dp[i]就等于dp[j]+1或者本身或者是dp[j]+1之间的最大值,因为在这个期间我们可以不断的更新dp[i]

3.初始化dp数组

初始化全为1即可

由于单个字母也构成递增子序列,所以长度为1

4.确定遍历顺序

顺序遍历,因为后面的dp值是由前面的推出来的

5.打印dp数组排错

题目代码:

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

LeetCode T674 最长连续递增序列

题目链接:674. 最长连续递增序列 - 力扣(LeetCode)

题目思路:

1.明确dp数组含义

dp[i]表示i为结尾元素的最长连续子数组

2.明确dp数组如何推导-递推公式

dp[i]这里只能由前面一个元素推出来,所以dp[i] = dp[i-1]+1

3.初始化dp数组

仍然初始化为1

4.确定遍历顺序

顺序遍历即可

5.打印dp数组排错

题目代码:

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

LeetCode T718 最长重复子数组

题目链接:718. 最长重复子数组 - 力扣(LeetCode)

题目思路:

1.明确dp数组含义

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

至于为什么是i-1和j-1我会在最后给出解答

2.明确dp数组如何推导-递推公式

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

为啥是i-1和j-1呢?为啥不是别的呢,我在这里举个例子大家就能理解

假设nums1 = [1,2,3,2,1]

       nums2 = [3,2,1,4,7]

我们这里匹配到i = 4,j=2 他们的前一个状态是两者同时向前一个单位,是同时回退

3.初始化dp数组

dp[i][0]和dp[0][j]都是无意义的,全部初始化为0即可,其他的随便初始化为啥都可以,因为在遍历的过程中会被覆盖的

4.确定遍历顺序

先遍历哪个都行,顺序遍历,因为右下角的元素依赖于左上角元素产生

5.打印dp数组排错

注:这里的dp[i][j]并不是答案,答案在数组中出现,因为这里dp数组的含义是以i-1和j-1结尾的数组a和数组b的最大公共子数组,这里i-1和j-1不一定是最后的结尾位置.

这里dp数组的定义为啥不用i和j呢?

我们思考这样一个问题,如果dp[i][j]定义为以i结尾和以j结尾,那么这里的dp[i][0]就需要遍历一遍数组a,[0][j]需要遍历一遍数组b,这样代码显得冗余了.

题目代码:

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.hqwc.cn/news/174154.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL字符串函数详解和实战(字符串函数大全,内含示例)

MySQL提供了许多字符串函数&#xff0c;用于处理和操作字符串数据。以下是一些常用的MYSQL字符串函数。 建议收藏以备后续用到查阅参考。 目录 一、CONCAT 拼接字符串 二、CONCAT_WS 拼接字符串 三、SUBSTR 取子字符串 四、SUBSTRING 取子字符串 五、SUBSTRING_INDEX 取子…

【IDEA】IntelliJ IDEA的使用2.0——结合实际场景提升工具使用

前言 IDEA作为一款非常不错的Java开发编辑工具&#xff0c;需要不断学习如何更好地使用IEDA工具&#xff0c;打造成得心应手的斧头。 本篇博客是结合实际场景提升IDEA使用的博客&#xff0c;会陆续收集一些实际使用场景&#xff0c;结合这些场景阐述如何更好地使用IDEA工具。…

50.批处理脚本(2/2)

目录 一、批处理命令。 &#xff08;1&#xff09;net use 连接共享文件夹或查看。 &#xff08;1.1&#xff09;连接共享文件夹。 &#xff08;1.2&#xff09;断开连接。 &#xff08;1.3&#xff09;显示当前连接。 &#xff08;1.4&#xff09;查看电脑的共享文件夹。…

苹果手机照片如何导入电脑?无损快速的传输办法分享!

前些天小编的朋友联系到我&#xff0c;说是自己苹果手机里面的照片太多&#xff0c;有好几千张&#xff0c;不知道该怎么快而无损地传到电脑。我想遇到这种情况的不止是小编的朋友&#xff0c;生活中遇到手机照片导入电脑的同学不在少数。不管是苹果手机还是安卓手机&#xff0…

vue 数字软键盘 插件 封装 可拖动

1、效果图 2、使用方式 <Keyboard v-if"show" close"show false" :inputDom"$refs.input" /> 封装的数字键盘 Keyboard.vue 组件代码 <template><divclass"keyboard"ref"keyboard":style"{ left: …

深入理解强化学习——马尔可夫决策过程:马尔可夫过程和马尔科夫链

分类目录&#xff1a;《深入理解强化学习》总目录 马尔可夫过程是一组具有马尔可夫性质的随机变量序列 S 1 , S 2 , ⋯ , S t S_1, S_2, \cdots, S_t S1​,S2​,⋯,St​&#xff0c;其中下一个时刻的状态 S t 1 S_{t1} St1​只取决于当前状态 S t S_t St​ 。我们设状态的历史…

计算机毕业设计 基于SpringBoot的在线考试系统的研究与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

伦敦金冬令时开市时间怎样调整

在刚刚过去的一周&#xff0c;欧美的金融市场已经正式进入了冬令时&#xff0c;这对伦敦金市场的交易时间也产生了影响。由于美国于今年11月5日(星期日&#xff09;开始正式实施冬令时间&#xff0c;所以香港的伦敦金平台的交易时间也随之而有所调整。 从今年11月6日开始&#…

二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>

文章目录 1 前言2 简介2 .1 什么是网络测速技术&#xff1f;2.2 网络测速技术的优点2.3 网络测速技术数据交互原理2.4 网络测速应用场景 3 WIZnet以太网芯片4 示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志&#xff1a; Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断&#xff1a; if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

ACM练习——第二天

今天又是一天课&#xff0c;满课&#xff0c;很累哈&#xff0c;计组真的挺难的&#xff0c;但是多学学还是可以学明白。行吧&#xff0c;继续进入今天的ACM练习&#xff0c;现阶段都是主要练习Java到C的语言过渡。 因为今天的题目多半都是昨天的延伸&#xff0c;我就不提供Jav…