day53【子序列】1143.最长公共子序列 1035.不相交的线 53.最大子序和

news2025/1/20 15:48:58

文章目录

  • 1143. 最长公共子序列
  • 1035.不相交的线
  • 53. 最大子序和

1143. 最长公共子序列

  • 题目链接:力扣链接

  • 讲解链接:代码随想录讲解

  • 题意:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

    一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
    两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

      示例 1:
      输入:text1 = "abcde", text2 = "ace" 
      输出:3  
      解释:最长公共子序列是 "ace" ,它的长度为 3 。
      
      示例 2:
      输入:text1 = "abc", text2 = "abc"
      输出:3
      解释:最长公共子序列是 "abc" ,它的长度为 3 。
      
      示例 3:
      输入:text1 = "abc", text2 = "def"
      输出:0
      解释:两个字符串没有公共子序列,返回 0 。
    
  • 思路
    dp数组代表第i-1和j-1为结尾的最长公共子序列的长度。
    所以在遍历中,for的条件要写从1开始遍历,循环条件为<=length;循环体中,如果当前字母相同,那结果就是前一个状态的dp+1;如果当前字母不是相同的,那结果就看前一个i和当前j / 前一个j和当前i中的最大值。

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        char[] char1 = text1.toCharArray();
        char[] char2 = text2.toCharArray();

        int[][] dp = new int[char1.length+1][char2.length+1];
        int res = 0;
        for(int i = 1; i <= char1.length; i++) {
            for(int j = 1; j <= char2.length; j++) {
                if(char1[i-1] == char2[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]);
                }
                res = Math.max(res, dp[i][j]);
            }
        }
        return res;
    }
}

1035.不相交的线

  • 力扣题目链接

  • 代码随想录讲解

  • 题意:在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。

    现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:

    nums1[i] == nums2[j]
    且绘制的直线不与任何其他连线(非水平线)相交。
    请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

    以这种方法绘制线条,并返回可以绘制的最大连线数。
    在这里插入图片描述
    示例 2:
    输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
    输出:3

      示例 3:
      输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
      输出:2
    
  • 思路:和1143是一样的,求最长公共子序列即可。按照顺序相等的就不会出现线相交的情况。

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

53. 最大子序和

  • 力扣题目链接

  • 代码随想录讲解链接

  • 题意:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    子数组 是数组中的一个连续部分。

      示例 1:
      输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
      输出:6
      解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
      
      示例 2:
      输入:nums = [1]
      输出:1
      
      示例3:
      输入:nums = [5,4,-1,7,8]
      输出:23
    
  • 贪心算法
    局部最优:当前的连续和为负数的时候就要立刻放弃,此时从下一个元素开始重新计算连续和。因为负数加上下一个元素,连续和只会越来越小。
    全局最优:选取最大的连续和

class Solution {
    public int maxSubArray(int[] nums) {
        //动态规划
        int count = 0;
        int res = Integer.MIN_VALUE;
        for(int i = 0; i < nums.length; i++) {
            count += nums[i];
            res = Math.max(count, res);
            if(count < 0) { //如果此时的连续和为负数了,那就从下一个元素从新计算。上一个开头的元素的最大连续和已经保存在res中了,就看后面有没有比这个更大的值了。
                count = 0;
            }
        }
        return res;
    }
}
  • 动态规划
    dp由两个方向推来,要么是前一种状态+当前元素,要么是从当前元素开始计算连续子序和,这两种情况选最大的
class Solution {
    public int maxSubArray(int[] nums) {
        //以i结尾的最大连续子数组的最大和
        int[] dp = new int[nums.length+1];
        dp[0] = nums[0];
        int res = dp[0];
        for(int i = 1; i < nums.length; i++) {
            //dp要么是从前一个状态推过来的,要么是自己从头开始算
            dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

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

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

相关文章

C++并发编程实战——05.内存模型与原子操作

文章目录 内存模型与原子操作内存模型原子操作和原子类型标准原子类型std::atomic_flagstd::atomic\<bool>std::atomic<T\*>std::atomic<user_define_type> 类模板非成员函数 同步操作和强制排序同步发生与先行发生内存序**顺序一致性**(memory_order_seq_cs…

Java选择与循环

1.选择 前言&#xff1a;什么是选择呢&#xff1f;在我们的人生中处处面临着选择&#xff0c;比如说在学校你可以选择玩&#xff0c;摆烂&#xff0c;当然也可以选择努力写代码&#xff0c;刷题。什么样的选择就会面临什么样的结果。 其实程序和人生一样&#xff1a;顺序中夹杂…

intellij idea拉取最新的依赖包

intellij idea setting 拉取最新的依赖包 File --> Settings --> Build, Execution, Deployment --> Build Tools --> Maven --> 勾选 Always update snapshots. 一般情况下&#xff0c;设置完就可以拉取到最新的依赖包了。 如下&#xff1a; 安装最新的依赖…

计算机视觉基础——基于yolov5-face算法的车牌检测

文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…

activiti的核心对象与API与对应操作的表与核心字段

【Deployment】 &#xff08;创建并部署一个新的流程定义&#xff09; 获取方式&#xff1a; repositoryService.createDeployment().deploy(); 对应的表&#xff1a;act_re_deployment 用于存储流程部署的相关信息。该表记录了每个流程部署的唯一标识符&#xff08;ID&#x…

【Redis】Redis在Linux与windows上的安装基本操作语法

一、Redis简介 Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再…

Python条件判断的运用

问题 在生活中&#xff0c;我们可以通过判断条件是否成立&#xff0c;来决定执行哪个分支。选择语句有多种形式&#xff1a;if语句&#xff0c;if-else语句&#xff0c;if-elif-else语句等。 Python使用if条件判断语句来实现条件判断时&#xff0c;可以在多个循环中实现对问题的…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路&#xff1a; 当时比赛时&#xff0c;拿计算器算的&#xff0c;然后辛辛苦苦也没对 看到这个数肯定很大&#xff0c;而且只求后9位&#xff0c;阶乘越…

三篇文章了解计算机网络(一)

目标 三篇文章&#xff0c;由浅入深理解计算机网络 适宜人群 小小白、无计算机网络基础&#xff0c;非技术人员&#xff0c;网络兴趣爱好者 内容简介 本文不谈技术&#xff0c;不谈理论&#xff0c;那谈什么&#xff1f;--谈生活。。。跑题了&#xff1f; 正文 网络是什…

SECS/GEN HSMS半导体通信协议解析

协议族总体结构 HSMS消息格式&#xff08;网口连接&#xff09; 超时时间设置 T3 回复超时&#xff1a;指发送指令到接收到回复指令的最大时间&#xff1b; T5 连接间隔&#xff1a;指断开连接和重新连接的最小时间&#xff1b; T6 控制指令超时时间&#xff1a;主要指连接选…

本地部署清华大模型 ChatGLM3

ChatGLM 是一个开源的、支持中英双语的对话语言模型&#xff0c;由智谱 AI 和清华大学 KEG 实验室联合发布&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。ChatGLM3-6B 更是在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上增加…

读程序员的制胜技笔记02_算法与数据结构

1. 认知偏见 1.1. 程序员也是人&#xff0c;他们和其他人在软件开发实践中有着同样的认知偏见 1.2. 只有你的同事真正关心你是如何做事的——其他人都只想要一个好的、有效的产品 1.3. 高估了不使用的类型 1.4. 不关心正确数据结构的好处 1.5. 认为算法只对库作者重要 2.…

Express框架开发接口之今日推荐等模块

1.初始化 const handleDB require(../handleDB/index) // 获取全部模块 exports.allModule (req, res) > {(async function () {})() } // 更新或者添加模块 exports.upModule (req, res) > {(async function () {})() } // 根据id删除模块 exports.delModule (req, …

Proteus仿真--基于51单片机的可演奏电子琴设计(仿真文件+程序)

本文主要介绍基于51单片机的可演奏电子琴设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中通过矩阵键盘可以实现不同的音乐播放 仿真运行视频 Proteus仿真--基于51单片机的可演奏电子琴设计&#xff08;仿真文件程序&#xff09; 附完整Proteu…

竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

Flutter 组件集录 | InheritedNotifier 内置状态管理组件

theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中&#xff0c;我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例&#xff0c;介绍了它的使用方式&#xff1a; | 案例演示 | 监听-通知关系 | | --- | …

DBeaver 23.2.3发布,带来多项增强和修复

数据库管理工具DBeaver最新版本23.2.3已经发布。这个版本带来了一系列的增强和修复&#xff0c;提升了用户的使用体验和工作效率。 以下是DBeaver 23.2.3版本的一些亮点功能&#xff1a; 数据编辑器方面的改进&#xff1a; Excel (XLSX) 导出现在支持列自动拟合&#xff0c;…

人大金仓迁移报错ERROR: invalid byte sequence for encoding “UTF8“: 0x00

Oracle迁移人大金仓&#xff0c;报错&#xff1a; com.kingbase8.utilKSOLException: ERROR: invalid byte sequence for encoding “UTF8”: 0x00 报错信息&#xff0c;如图所示&#xff1a; 解决方案 1、设置参数&#xff0c;在kingbase.conf 最后面添加参数&#xff1a;ign…

串口通信(8)串口中断“边接收边解析数据“的通信程序

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

linux笔记总结-基本命令

参考&#xff1a; 1.Linux 和Windows比 比较 &#xff08;了解&#xff09; 1. 记住一句经典的话&#xff1a;在 Linux 世界里&#xff0c;一切皆文件 2. Linux目录结构 /lib • 系统开机所需要最基本的动态连接共享库&#xff0c;其作用类似于Windows里的DLL文件。几 乎所有…