代码随想录刷题day52|最长递增子序列最长连续递增序列最长重复子序列

文章目录

  • day52学习内容
  • 一、最长递增子序列
    • 1.1、动态规划五部曲
      • 1.1.1、 确定dp数组(dp table)以及下标的含义
      • 1.1.2、确定递推公式
      • 1.1.3、 dp数组如何初始化
      • 1.1.4、确定遍历顺序
      • 1.1.5、输出结果
    • 1.2、代码
  • 二、最长连续递增序列
    • 2.1、动态规划五部曲
      • 2.1.1、 确定dp数组(dp table)以及下标的含义
      • 2.1.2、 确定递推公式
      • 2.1.3、 dp数组如何初始化
      • 2.1.4、确定遍历顺序
      • 2.1.5、输出结果
    • 2.2、代码
  • 三、最长重复子序列--先跳过没想明白
    • 3.1、动态规划五部曲
      • 3.1.1、 确定dp数组(dp table)以及下标的含义
      • 3.1.2、确定递推公式
      • 3.1.3、 dp数组如何初始化
      • 3.1.4、确定遍历顺序
      • 3.1.5、输出结果
    • 3.2、代码
  • 总结
    • 1.感想
    • 2.思维导图


day52学习内容

day52主要内容

  • 最长递增子序列
  • 最长连续递增序列
  • 最长重复子序列

声明
本文思路和文字,引用自《代码随想录》


一、最长递增子序列

300.原题链接

1.1、动态规划五部曲

1.1.1、 确定dp数组(dp table)以及下标的含义

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

1.1.2、确定递推公式

要构建以 nums[i] 结尾的最长递增子序列,我们需要观察在 i 之前的所有元素 j(其中 j < i)。如果 nums[j] 小于 nums[i],则意味着元素 nums[i] 可以接在以 nums[j] 结尾的递增子序列之后,形成一个新的递增子序列。因此,以 nums[i] 结尾的递增子序列的长度可以从以 nums[j] 结尾的递增子序列的长度推导出来:

dp[i]=max(dp[i],dp[j]+1)

这里,dp[j] + 1 表示将 nums[i] 加入到以 nums[j] 结尾的子序列中,因此序列长度增加 1。我们需要对所有可能的 j(使得 nums[j] < nums[i])进行检查,并取这些情况中的最大值。

1.1.3、 dp数组如何初始化

初始化成1即可。因为不管数组中的元素如何,每个元素本身至少可以构成一个长度为 1 的递增子序列。

1.1.4、确定遍历顺序

从小到大遍历

1.1.5、输出结果

通过遍历所有的 dp[i] 来找到全局最长的递增子序列。即最终解 res 为:

res=max(dp[i])

这一过程确保了考虑到以每个不同元素结尾的所有可能递增序列,从而找到全局最优的解。

1.2、代码

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;}
}

二、最长连续递增序列

674.原题链接

2.1、动态规划五部曲

2.1.1、 确定dp数组(dp table)以及下标的含义

-dp[i]表示以元素 nums[i] 结尾的最长连续递增子序列的长度

2.1.2、 确定递推公式

  1. 处理每个元素

    • 从数组的第一个元素开始,假设每个元素本身至少构成一个长度为1的序列。
    • 接着,从数组的第二个元素起,比较当前元素和它前一个元素的大小:
      • 如果当前元素比前一个元素大,说明当前元素可以延续前一个元素的连续递增子序列,因此,当前元素的子序列长度将是前一个元素的子序列长度加1。
      • 如果当前元素不大于前一个元素,那么以当前元素为结束的最长子序列就是它本身,长度为1。
  2. 更新最大长度

    • 在处理每个元素时,都需要检查并更新已知的最长连续递增子序列的长度。这是通过比较当前最长长度和当前元素的子序列长度来实现的。

2.1.3、 dp数组如何初始化

起始值设为1,因为至少有一个元素时最长递增子序列长度至少为1。

2.1.4、确定遍历顺序

从小到大遍历

2.1.5、输出结果

  • 遍历完数组后,已经更新的最长长度即为整个数组中最长连续递增子序列的长度
  • return res; 返回 res,它现在包含了输入数组中最长连续递增子序列的长度。

2.2、代码

class Solution {public int findLengthOfLCIS(int[] nums) {if (nums == null || nums.length == 0) return 0; // 处理空数组或null的情况int[] dp = new int[nums.length];Arrays.fill(dp, 1); // 初始每个元素至少可以是长度为1的递增子序列int res = 1; // 至少有一个元素时,最长递增子序列长度至少为1for (int i = 1; i < nums.length; i++) { // 从第二个元素开始检查if (nums[i] > nums[i - 1]) { // 比较当前元素和前一个元素dp[i] = dp[i - 1] + 1; // 如果当前元素大于前一个元素,递增子序列长度加1}res = Math.max(res, dp[i]); // 更新最长递增子序列长度}return res; // 返回最长递增子序列的长度}
}

三、最长重复子序列–先跳过没想明白

718.原题链接

3.1、动态规划五部曲

3.1.1、 确定dp数组(dp table)以及下标的含义

3.1.2、确定递推公式

3.1.3、 dp数组如何初始化

3.1.4、确定遍历顺序

从小到大遍历

3.1.5、输出结果

3.2、代码


总结

1.感想

  • 第三题没想明白。。

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。

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

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

相关文章

参会记录|全国多媒体取证暨第三届多媒体智能安全学术研讨会(MAS‘2024)

前言&#xff1a;2024年4月13日上午&#xff0c;我与实验室的诸位伙伴共聚江西南昌的玉泉岛大酒店&#xff0c;参加了为期一天半的全国多媒体取证暨第三届多媒体智能安全学术研讨会&#xff08;MAS’2024&#xff09;。本届学术研讨会由江西省计算机学会、江西省数字经济学会主…

基于单片机恒温控制系统的开发研究

摘要:温度是工业生产的过程中最为常见的工艺参数,温度控制直接影响工业生产产品的质量,特别在机械、冶金、化工、建材、石油等工业生产中温度控制占据着重要的作用。虽然目前温度控制有多种方式,但是在专业化和高指标要求等方面还有待进一步开发研究。随着科学技术的进步,…

PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目

在创建PHP项目之前我们需要安装PHP插件&#xff0c;安装步骤如下&#xff1a;Windows&#xff1a;IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目&#xff0c;导入之后选择&#xff0c;File > Setting 选择对应 CLL Interpreter&#xff0c;如果没有操…

GitHub登录收不到邮箱验证码

由于长时间没有登录GitHub&#xff0c;浏览器可能清除了相应的cookie信息&#xff0c;所以需要对应绑定邮箱进行验证&#xff0c;但因为邮箱长时间没有收到验证码&#xff0c;所以给到以下一种可能解决的方法&#xff1a; 需要输入验证码进行验证 我们可以打开QQ邮箱&#xff0…

java的深入探究JVM之类加载与双亲委派机制

前言 前面学习了虚拟机的内存结构、对象的分配和创建&#xff0c;但对象所对应的类是怎么加载到虚拟机中来的呢&#xff1f;加载过程中需要做些什么&#xff1f;什么是双亲委派机制以及为什么要打破双亲委派机制&#xff1f; 类的生命周期 类的生命周期包含了如上的7个阶段&a…

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…

比特币突然暴跌

作者&#xff1a;秦晋 周末愉快。 今天给大家分享两则比特币新闻&#xff0c;也是两个数据。一则是因为中东地缘政治升温&#xff0c;传统资本市场的风险情绪蔓延至加密市场&#xff0c;引发加密市场暴跌。比特币跌至66000美元下方。杠杆清算金额高达8.5亿美元。 二则是&#x…

Spring(24) Json序列化的三种方式(Jackson、FastJSON、Gson)史上最全!

目录 一、Jackson 方案&#xff08;SpringBoot默认支持&#xff09;1.1 Jackson 库的特点1.2 Jackson 的核心模块1.3 Maven依赖1.4 代码示例1.5 LocalDateTime 格式化1.6 统一配置1.7 常用注解1.8 自定义序列化和反序列化1.9 Jackson 工具类 二、FastJSON 方案2.1 FastJSON 的特…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

比特币减半后适合挖矿吗

减半是指比特币挖矿奖励减半的过程&#xff0c;每当挖出210,000个区块后&#xff0c;比特币的挖矿奖励就会减半。减半后&#xff0c;每个区块的挖矿奖励减少一半&#xff0c;这对于矿工来说意味着他们挖到新的比特币的速度将会减慢。 减半对于挖矿是否适合取决于多个因素&…

【练习】二分查找

1、704 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;代码实现 package com.hh.practice.leetcode.array.demo_02;public class BinarySearch_704 {public int search(int[] nums, int target) {int i 0,j nums.length -1;while (i < j){int mid (ij) &…

【QT+QGIS跨平台编译】181:【QGIS+Qt跨平台编译】—【错误处理:找不到_DEBUGA】

点击查看专栏目录 文章目录 一、找不到_DEBUGA二、原因分析三、错误处理 一、找不到_DEBUGA 报错信息&#xff1a; 二、原因分析 采用了非UNICODE&#xff1a; DEFINES - UNICODE没法识别 _DEBUGA 但可以识别 _DEBUG 三、错误处理 修改 _DEBUGA 为 _DEBUG

【Linux】初识线程

目录 线程的概念 Linux中线程的概念 一、线程的基本定义 二、线程的特点 三、线程的实现方式 四、线程的使用场景 五、线程同步与通信的重要性 线程的优缺点 常见的线程异常 线程异常的后果 线程异常对线程本身的影响 线程异常对整个进程的影响 如何应对线程异常 …

android 编译报 out/.lock 提示错误

注&#xff1a; 本文只是博主学习记录分享&#xff0c;仅供参考。如有错误请指出&#xff0c;谢谢&#xff01; android 源码编译过程中&#xff0c;终端卡住无反应&#xff0c;关闭终端后再次编译报如下错误&#xff1a; start build android 02:12:32 Waiting up to 10s to l…

搜索服务访问系列

1、https://chat.caifree.com/ 3.5 2、https://gpt4fr.ee/ 4&#xff0c;但是不稳定 3、https://chat.3211000.xyz/ 4 4、https://chat.p1ay.top/ 3.5 5、https://chat.aivvm.com/ 直呼内行 Lobe&#xff0c;可以调用 4

C语言专项训练

道阻且长&#xff0c;接下来就要开始数据结构的学习&#xff0c;而学不可以不练&#xff0c;在接下来的学习中&#xff0c;数据结构学习的同时&#xff0c;c语言训练也要开始更新了&#xff5e; NO.1 函数 1.void函数声明 这道题一看就秒了(开玩笑)我们在知道答案的同时&#…

操作系统——死锁——银行家算法

银行家算法的实现需要三个矩阵&#xff1a; Max矩阵&#xff1a;用于存储每个进程完成所需要的全部资源量Allocation矩阵&#xff1a;用于存储每个进程每个资源已分配的情况Need矩阵&#xff1a;存储每个进程还需要的各个资源数 如下以一个实例来说明银行家算法&#xff1a; …

Linux多进程开发2 - 进程间通信

1、进程间通信的概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的&#xff0c;没有关联&#xff0c;不能在一个进程中直接访问另一个进程的资源。但是&#xff0c;进程不是孤立的&#xff0c;不同的进程需要进行信息的交换和状态的传递等&…

从C到Py:Python的组合数据类型

这一部分开始&#xff0c;我们将讲解Python中的组合数据类型&#xff0c;这里的知识十分基础而且重要&#xff0c;也已经与C语言的框架愈差愈远。 目录 序列和索引 1、概念 2、切片操作 3、序列的其他操作 列表 1、概念 2、创建与删除 3、列表的操作 4、列表生成式 …

string和char*的转换

1、使用 c_str() 方法&#xff1a; std::string 类提供了一个 c_str() 方法&#xff0c;它返回一个指向以 null 结尾的字符数组的指针&#xff08;即 C 风格的字符串&#xff09;。 std::string str "Hello"; const char* charPtr str.c_str();注意&#xff1a;返…