当前位置: 首页 > news >正文

算法训练(leetcode)二刷第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列

刷题记录

  • 1143. 最长公共子序列
  • 1035. 不相交的线
  • 53. 最大子数组和
    • 动态规划
    • 优化版
  • 392. 判断子序列

1143. 最长公共子序列

leetcode题目地址

本题和300. 最长递增子序列相似(题解)。

使用动态规划:

  1. dp数组含义:dp[i][j]表示 以text1[i-1]结尾的子串A以text2[j-1]结尾的子串B 的最长公共子序列的长度。
  2. 思路同300. 最长递增子序列,每个状态更新基于前面的状态,为了防止越界,dp数组下标从1开始。
  3. 状态转移方程:
  • 当 text1[i-1] == text2[j-1] 时,dp[i][j] = dp[i-1][j-1] + 1;
  • 当 text1[i-1] == text2[j-1] 时,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    • 这里解释一下 max(dp[i-1][j], dp[i][j-1]) 的含义:由于dp数组存储的是两个子串的最长公共子序列的长度,当两个子串的单个字符不匹配时,对应下标处的dp值要赋值为前面子串的匹配情况取最长,即dp[i-1][j]表示以text1[i-2]结尾的子串A以text2[j-1]结尾的子串B 的最长公共子序列的长度,dp[i][j-1]表示以text1[i-1]结尾的子串A以text2[j-2]结尾的子串B 的最长公共子序列的长度。

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

// java
class Solution {public int longestCommonSubsequence(String text1, String text2) {int len1 = text1.length(), len2 = text2.length();char[] arr1 = text1.toCharArray(), arr2 = text2.toCharArray();int[][] dp = new int[len1+1][len2+1];for(int i = 1; i <= len1; i++){for (int j = 1; j <= len2; j++){if(arr1[i-1] == arr2[j-1]){dp[i][j] = dp[i-1][j-1] + 1;} else{dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]);}// System.out.print(dp[j] + " ");}// System.out.println();}return dp[len1][len2];}
}

1035. 不相交的线

leetcode题目地址

本题其实与上一题1143. 最长公共子序列的思路完全一致。题目的描述时要求找不相交的线的最大连线数,而不相交的线其实就是找两个序列的公共子序列(不相交就是两个子序列在原序列中相对顺序一致)。

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

// java
class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;int[][] dp = new int[len1+1][len2+1];for(int i=1; i<=len1; i++){for(int j=1; j<=len2; j++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1] + 1;} else{dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[len1][len2];}
}

53. 最大子数组和

leetcode题目地址

  • dp数组含义:
    dp[i]表示以nums[i]结尾(包含)的最大子数组和

  • 状态转移方程:
    dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);

    • dp[i-1] + nums[i]表示上一个(以nums[i-1]结尾的)子序列加入当前nums[i]
    • nums[i]表示从当前元素开始从头计算(仅包含当前元素的子序列)
  • 初始化:
    dp[i]表示以nums[i]结尾(包含)的最大子数组和,因此dp[0]初始化为nums[0],后面状态均为0.

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

动态规划

// java
class Solution {public int maxSubArray(int[] nums) {int len = nums.length;int[] dp = new int[len];dp[0] = nums[0];int result = nums[0];for(int i=1; i<len; i++){dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);result = Math.max(dp[i], result);}return result;}
}

优化版

可以看到在动规中每个状态的更新都仅依赖于前一个状态,因此无需使用数组,仅使用一个变量来记录前一个状态。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

// java
class Solution {public int maxSubArray(int[] nums) {int len = nums.length;int res = nums[0];int result = nums[0];for(int i=1; i<len; i++){res = Math.max(res + nums[i], nums[i]);result = Math.max(res, result);}return result;}
}

392. 判断子序列

leetcode题目地址

本题本质上依旧是寻找最长公共子序列。给定s和t,判断s是否是t的子序列,也就是查看s和t的最长公共子序列长度是否等于s的长度。

  • dp数组含义:
    dp[i][j]表示 以s[i-1]结尾的子串A以t[j-1]结尾的子串B 的最长公共子序列。
  • 状态转移方程:
    • 当s[i-1] == t[j-1]时,dp[i][j] = dp[i-1][j-1] + 1;
    • 当s[i-1] != t[j-1]时,dp[i][j] = dp[i][j-1];

这里不匹配时为什么是 dp[i][j] = dp[i][j-1] 而不是 dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])
因为是在t中查找s是否是子序列,因此在不匹配时,只能删除t中的字符来查看分别以s[i-1]和t[j-2]结尾的子串的匹配情况。

而1143. 最长公共子序列不给定谁为子串,因此需要分别考虑各自为另一个字符串的子串的情况。

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

// java
class Solution {public boolean isSubsequence(String s, String t) {char[] sArry = s.toCharArray();char[] tArry = t.toCharArray();int len1 = s.length(), len2 = t.length();int[][] dp = new int[len1+1][len2+1];for(int i=1; i<=len1; i++){for(int j=1; j<=len2; j++){if(sArry[i-1] == tArry[j-1]){dp[i][j] = dp[i-1][j-1] + 1;} else {dp[i][j] = dp[i][j-1];}// System.out.print(dp[i][j] + " ");}// System.out.println();}return dp[len1][len2] == len1;}
}

相关文章:

算法训练(leetcode)二刷第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列

刷题记录 1143. 最长公共子序列1035. 不相交的线53. 最大子数组和动态规划优化版 392. 判断子序列 1143. 最长公共子序列 leetcode题目地址 本题和300. 最长递增子序列相似&#xff08;题解&#xff09;。 使用动态规划&#xff1a; dp数组含义&#xff1a;dp[i][j]表示 以…...

【JavaWeb学习Day20】

Tlias智能学习系统 员工登录 三层架构&#xff1a; Controller&#xff1a;1.接收请求参数&#xff08;用户名&#xff0c;密码&#xff09;2.调用Service方法3.响应结果 具体实现&#xff1a; /*** 登录*/ ​ PostMapping("/login") public Result login(Reque…...

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题 + 答案

青少年软件编程(Python)等级考试试卷(二级) ↓↓↓↓↓↓ 模拟 分数:100 题数:37 一、单选题(共25题,共50分) 1. 已知字典如下 dic1 = { name: Ming, age:20, grade: A, Tel:6666666 } 以下哪个代码运行结果为20?( ) A. dic1(age) B. dic1[1] C. dic1(20) D. dic1[ag…...

一、对iic类模块分析与使用

bmp280驱动代码 说明&#xff1a; 1、该模块用于获取气压&#xff0c;温度&#xff0c;海拔等数据。 vcc&#xff0c;gnd接电源 sda &#xff0c;scl 接iic通信引脚 2、该模块使用iic通信&#xff0c;通过iic发送请求相关类的寄存器值&#xff0c;芯片获取对应寄存器返回的数据…...

ROS 2机器人开发--CMakeLists.txt 文件详解

很多小白宝宝不懂CMakeLists.txt 究竟是干什么的&#xff0c;本文对CMakeLists.txt 文件进行详解 CMakeLists.txt 是 CMake 的核心文件&#xff0c;用户通过这个文件告诉 CMake 如何构建项目。这个文件通常包括设置项目名称、版本号、语言标准、编译器选项、查找依赖包、添加可…...

kan与小波,和不知所云的画图

文章目录 小波应用范围与pde小波的名字 画图图(a)&#xff1a;数值解向量 \( u \)图(b)&#xff1a;数值解向量 \( v \)结论图4 小波 在你提供的代码中&#xff0c;小波变换&#xff08;Wavelet Transform&#xff09;被用于 KANLinear 类中。具体来说&#xff0c;小波变换在 …...

使用DeepSeek实现自动化编程:类的自动生成

目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节&#xff0c;让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中&#xff0c;自动化编程工具如…...

算法题:快速排序

一、快速排序 1、快速排序总结 快速排序是一种高效的排序算法&#xff0c;基于分治法的思想。 分区操作是快速排序的核心&#xff0c;将数组分为两部分。 原地分区可以减少空间复杂度&#xff0c;提高效率。 快速排序的平均时间复杂度为 O(n log n)&#xff0c;但在最坏情况…...

Python的那些事第三十六篇:基于 Vega 和 Vega-Lite 的数据可视化解决方案,Altair 声明式可视化库

Altair 声明式可视化库:基于 Vega 和 Vega-Lite 的数据可视化解决方案 摘要 在数据科学和分析领域,有效的数据可视化是理解数据、发现模式和传达见解的关键。Python 作为数据科学的主要编程语言之一,提供了多种数据可视化库。其中,Altair 是一个基于 Vega 和 Vega-Lite 的…...

aws(学习笔记第三十课) 练习使用transit gateway

aws(学习笔记第三十课) 使用transit gateway 学习内容&#xff1a; 什么是transit gateway构造两个vpc&#xff0c;并且使用session manager访问private subnet的ec2练习使用transit gateway 1. 什么是transit gateway Transit Gateway的概念 Transit Gateway就是VPC和OnPro…...

Phpstudy中的MySQL无法正常启动或启动后自动暂停,以及sqlilab环境搭建出现的问题解决方法

【解决方法】 无法启动的原因是Phpstudy中的MySQL与本地的mysql重名&#xff0c;导致无法正常启动&#xff1b;所以这时我们就需要将本地的MySQL进行修改名称&#xff1b; 或者修改phpstudy中数据库的端口号&#xff0c;但是我觉得还是不是很好解决这种问题 最后一个方法&#…...

【Android】安卓付款密码输入框、支付密码输入框

如图 代码部分&#xff1a; public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray new TextView[6];private List<Integer> mPayP…...

Python异常处理:从入门到精通的实用指南

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

【AVL树】—— 我与C++的不解之缘(二十三)

什么是AVL树&#xff1f; AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家&#xff0c;他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树&#xff0c;说白了就是能够自己控制平衡结构…...

用大白话解释日志处理Log4j 是什么 有什么用 怎么用

Log4j是什么&#xff1f; Log4j就像程序的“黑匣子”&#xff0c;专门用来记录软件运行时的各种信息&#xff0c;比如哪里报错、性能如何、用户操作轨迹等。它是Java领域最常用的日志框架之一&#xff0c;可以灵活控制日志内容、输出位置&#xff08;控制台、文件、数据库等&a…...

无人机遥控器的亮度 和 两个工作频率

工作频率 2.4000-2.4835 GHz &#xff0c; 5.725-5.850 GHz 1.这是一个无人机的遥控器的两个工作频率&#xff0c;为什么会有两个工作频率&#xff1f; 无人机的遥控器采用双频段设计&#xff08;2.4GHz 和 5.8GHz&#xff09;&#xff0c;主要是为了解决以下问题并优化性…...

【Linux】命令行参数 | 环境变量(四)

目录 前言&#xff1a; 一、命令行参数&#xff1a; 1.main函数参数 2.为什么有它&#xff1f; 二、环境变量&#xff1a; 1.main函数第三个参数 2.查看shell本身环境变量 3.PATH环境变量 4.修改PATH环境变量配置文件 5.HOME环境变量 6.SHELL环境变量 7.PWD环境变…...

算法002——复写零

力扣——复写零点击即可跳转 这道题还是运用 双指针&#xff0c;我们从左往右开始&#xff0c;让 cur 0&#xff0c;dest 0,当我们循环时&#xff0c;会覆盖后面的值&#xff0c;所以从左到右无法实现&#xff0c;我们运用 从右到左的方式。 以示例一数组为例&#xff0c;从…...

例子 DQN + CartPole: 深入思考一下,强化学习确实是一场智能冒险之旅!

强化学习的概念 在技术人员眼里&#xff0c;深度学习、强化学习&#xff0c;或者是大模型&#xff0c;都只是一些算法。无论是简单&#xff0c;还是复杂&#xff0c;我们都是平静的看待。当商业元素日益渗透进技术领域&#xff0c;人人言必称大模型的时候。技术人该反思一下&a…...

java 实现xxl-job定时任务自动注册到调度中心

xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…...

SAP MM新手避坑指南:手把手教你搞定UB型STO库存调拨(从ME21N到MIGO全流程)

SAP MM新手避坑指南&#xff1a;手把手教你搞定UB型STO库存调拨&#xff08;从ME21N到MIGO全流程&#xff09; 刚接触SAP MM模块的新手&#xff0c;面对库存转储订单&#xff08;STO&#xff09;这个看似简单实则暗藏玄机的功能时&#xff0c;往往会在UB型订单的创建和操作过程…...

【MATLAB源码-第410期】基于matlab的图像去雾系统设计—采用暗通道先验、颜色衰减与导向滤波融合。

操作环境&#xff1a;MATLAB 2024a1、算法描述基于MATLAB的图像去雾系统设计与实现 摘要 雾霾天气会显著削弱成像系统获取场景信息的能力&#xff0c;使图像出现对比度下降、颜色失真、边缘模糊及远景细节衰减等问题&#xff0c;从而影响目标检测、场景理解、智能监控与辅助驾驶…...

3DMax烘焙贴图实战:从零到一整合建筑模型,优化Unity运行性能

1. 为什么需要烘焙贴图&#xff1a;从性能瓶颈到解决方案 第一次把复杂建筑模型导入Unity时&#xff0c;我盯着屏幕上龟速移动的视角和疯狂跳动的帧率数字&#xff0c;整个人都是懵的。检查资源管理器才发现&#xff0c;这个看似普通的五层楼模型竟然用了87张不同尺寸的贴图&am…...

考虑需求响应和碳交易的综合能源系统日前优化调度模型 关键词:柔性负荷 需求响应 综合能源系统 ...

考虑需求响应和碳交易的综合能源系统日前优化调度模型 关键词&#xff1a;柔性负荷 需求响应 综合能源系统 参考&#xff1a;私我 仿真平台&#xff1a;MATLAB yalmipcplex 主要内容&#xff1a;在冷热电综合能源系统的基础上&#xff0c;创新性的对用户侧资源进行了细致的划…...

利用快马AI快速原型:十分钟搭建软件下载站首页与详情页

最近在帮朋友做一个软件下载站的原型&#xff0c;要求能快速上线测试用户反馈。传统开发方式从设计到编码至少需要一周&#xff0c;但这次我用InsCode(快马)平台的AI生成功能&#xff0c;十分钟就搞定了基础框架&#xff0c;分享下具体实现思路。 首页布局设计 首页需要突出展示…...

用Python+OpenCV重构九点标定:抛弃Halcon的轻量化视觉方案

PythonOpenCV九点标定实战&#xff1a;从原理到嵌入式部署的全栈指南 引言&#xff1a;为什么选择开源方案替代Halcon&#xff1f; 在工业视觉领域&#xff0c;九点标定作为连接像素坐标与物理坐标的桥梁&#xff0c;直接影响着定位精度和系统稳定性。传统方案多依赖Halcon等商…...

高性能NoSQL

关系数据库已经非常成熟&#xff0c;强大的 SQL 功能和 ACID 的属性&#xff0c;使得关系数据库广泛应用于各式各样的系统中&#xff0c;但这并不意味着关系数据库是完美的&#xff0c;关系数据库存在如下缺点。 关系数据库存储的是行记录&#xff0c;无法存储数据结构 关系数据…...

掌握微信小程序逆向分析的3个关键:wxappUnpacker深度解析与实战指南

掌握微信小程序逆向分析的3个关键&#xff1a;wxappUnpacker深度解析与实战指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 在微信小程序开发与学习过程中&#xff0c;开发者常常需要深入理解优秀小程序的实现原理…...

HiveWE:魔兽争霸III地图编辑器的革命性升级,让地图创作速度提升300%

HiveWE&#xff1a;魔兽争霸III地图编辑器的革命性升级&#xff0c;让地图创作速度提升300% 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE HiveWE是一款专注于速度和易用性的魔兽争霸III世界编辑器&#x…...

手把手教你用Verilog实现一个带权重的轮询仲裁器(附Testbench与仿真波形)

手把手教你用Verilog实现带权重的轮询仲裁器 在数字电路设计中&#xff0c;仲裁器(Arbiter)是一个常见但至关重要的模块。想象一下&#xff0c;当多个主设备&#xff08;比如CPU、DMA控制器等&#xff09;需要访问同一个从设备&#xff08;比如内存&#xff09;时&#xff0c;仲…...