算法训练营DAY52|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

news2024/11/25 1:01:41

前两道题思路是一模一样的,但是需要认真理解,最后一道虽然思路不算难,但是需要注意的细节一点不少。

1143. 最长公共子序列 - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/longest-common-subsequence/最长公共子序列,与上一期最后一道的区别在于本题要求的是两个数组的可以删除中间数据的最长公共的部分。是删除中间部分的多于元素后,在不改变数据顺序情况下得到的最长公共子序列,

也就是要把求两数组的最长子序列的题,和求不连续最长子序列的题结合在一起的考题。

dp数组的含义:对于两个数组求子序列问题,通常我们要设立二维数组来辅助解题,二维数组的含义依然是到以i-1和j-1下标的对应数据 最长公共子序列为多长。是以i-1和j-1对应的下标对应的数据为结尾,是因为为了方便初始化,不懂得可以去看我上一期的文章。

递推公式:递推公式是有讲究的,这也是与上一期的最后一题的差别所在,求可以删除中间数据拼成的序列,也就是求非连续的子序列的问题,一定要用双for循环来遍历,

if(nums1【i-1】==nums2【j-1】)dp【i】【j】=dp【i-1】【j-1】+1

这也是之前我们讲过的递推公式,因为找到了一个相等的字符,所以就是上一个位置+1的长度。

那说回来,如果两个字符不相等呢?又如何用代码来表示两个数组之间的删除中间数据呢?这也就有了第二个递推公式

else      dp【i】【j】=max(dp【i-1】【j】,dp【i】【j-1】)

也就是说如果两个数据此时不相等,那么它这个位置填入的长度应该就是dp【i-1】【j】,dp【i】【j-1】取最大值,为什么是这样呢?我们可以依照所给案例分析,abcde和ace,我们假设现在遍历到这两个数组的第2个位置,很显然2下标下c和e是不相等的,那么abc和ace的两部分最长公共子序列多长呢?既然知道这两个位置一定不等,那么就有两种情况,可能最大子序列存在于abc和ac的情况,也可能最大子序列存在于ab和ace的情况,这两种情况的最大子序列中,我们取最大值,也就是当前遍历的两字符不等的情况。

dp数组的初始化:数组的初始化也很简单,因为我们上一期已经讲过,对于这种二维数组的定义为i-1和j-1的含义时,第一行和第一列没有意义是非法状态,所以都初始化为0,而其他部分初始化什么值不重要,都会被递推公式所覆盖。

遍历顺序:从左到右,从上到下。

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1,0));
        for(int i=1;i<=text1.size();i++){
            for(int j=1;j<=text2.size();j++){
                if(text1[i-1]==text2[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

代码就是这样了,实际上也不是很难,但是那个else也就是字符不相等的情况,怎么去处理,相信对于第一次做这道题的朋友来说,还是很懵b的。


1035. 不相交的线 - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/uncrossed-lines/这道题和第一道题思路一模一样,为什么这么说呢?它是求两数组相等数字俩俩连线,且不能相交,其实就是求两个数组的最长递增子序列,有多长,有多长就有几个连线。至于题中说的一个数据只能被连一次,那是一定的。例如第一个数组的某数据和第二个数组的连续两个数据都相等,但是根据递推公式它们的连线条数是根据之前连线条数有关,也就是说如果之前没有一样的数据,连线条数是0,那么dp【i-1】【j-2】和dp【i-1】【j-1】不也都是0吗,所以得到的连线条数都是1。这里你可以随便举例子,即使之前已经有一条连线,也仅仅只有dp【i】【j】能够变成2,而另一个也能够与第一个数组相等数据那个,是由dp【i-1】【j-2】推出来的,画dp数组就会知道,最大数都集中在斜线上,从左上角到右上角那条斜线,主导着大值。所以有时候打印dp数组还是很重要的。

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>>dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
        for(int i=1;i<=nums1.size();i++){
            for(int j=1;j<=nums2.size();j++){
                if(nums1[i-1]==nums2[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[nums1.size()][nums2.size()];
    }
};

好了,经过了一些列的分析我直接给出代码,代码和上一道题一模一样。

至于为什么这里的二维数组我们不需要result来存取最大值,然后输出,为什么这里的dp数组最后一位置是最大值呢?这是因为else那一条语句的缘故,因为我们求得是非连续的,而我们这样写递推公式dp【i】【j】会一直保留着之前的最长子序列的长度,自然也就不用result来存取最大值了。


53. 最大子数组和 - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/maximum-subarray/这道题以前讲贪心算法时候,做过一次,我们再用动态规划思想,做一次,解题的思路不是很难,但是细节需要注意。起初我在想这道题的解法时候,递推公式也像上面的题一样,写成两个,但后来遇到全负数的数组却无法解出。

dp数组含义:dp数组的含义代表截止到i的连续的最大子数组和,根据dp数组的含义,也意味着我们这时候需要result来存储最大的和了。

递推公式:递推公式实际上是很简单的一句代码,但是由于前面两道题的启发,我有点想复杂了,

dp【i】=max(dp【i-1】+nums【i】,nums【i】)

其实看过贪心的朋友,再看这种思路反而应该更好想明白,dp数组由两个方向可以推出来,一个是前面的连续数组相加的和加上当前遍历到的数据做和,另一个是只有当前的数据,它们做一个比较,取较大者,其实仔细想想这样无论数组是否是纯负数都能得到解决了,起初的想法是result赋值为最小值,然后和result比较,再配上我那个ifelse语句,出了不少差错。

初始化和遍历顺序都是千篇一律这里不做讲解了。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int>dp(nums.size(),0);
        if(nums.size()==0)return 0;
        dp[0]=nums[0];int result=dp[0];
        for(int i=1;i<nums.size();i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
            result=max(result,dp[i]);
        }
        return result;
    }
};

动态规划类题目,都是代码简单,思路难想,而且有的时候代码也有很多要注意的细节,要多练习。

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

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

相关文章

2-ChatGPT插件到Google浏览器、Firefox浏览器,并进行ChatGPT工作。

ChatGPT插件到Google浏览器、Firefox浏览器&#xff0c;并进行ChatGPT工作。1&#xff0c;首先&#xff0c;在装插件ChatGPT forGoogle插件时&#xff0c;我没安装成功&#xff0c;问题是我没有区分Google浏览器和双核浏览器的差别。2&#xff0c;如何使用ChatGPT在浏览器上进行…

基于北方苍鹰算法优化LSTM(NGO-LSTM)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023软件测试面试全方位话术,你想要的全都有

目录 2023软件测试面试话术包含&#xff1a;自我介绍简历人资题话术面试题项目介绍 自我介绍 软件测试基础面试题 人资高频率问题 简历 总结 2023软件测试面试话术包含&#xff1a;自我介绍简历人资题话术面试题项目介绍 目录如下 自我介绍 软件测试基础面试题 需求的标准…

参数嗅探 - 为何产生

这个问题会在参数话的SQL语句&#xff08;例如存储过程&#xff09;与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分&#xff0c;第1部分会介绍下参数嗅探&#xff08;Parameter Sniffing&#xff09;的概况&#xff0c;第2部分我们介绍下如何解决这个问题…

git整体工作流程

文章目录本地流程远程仓库流程git 代码量统计本地流程 工作区 暂存区 本地仓库 远程仓库流程 git 代码量统计 # 统计本地仓库的代码量 git log --all --since2022-01-01 --until2022-01-05 --format"%aN" --no-merges | sort | uniq -c | while read data; do na…

浅析 SeaweedFS 与 JuiceFS 架构异同

SeaweedFS 是一款高效的分布式文件存储系统&#xff0c;最早的设计原型参考了 Facebook 的 Haystack&#xff0c;具有快速读写小数据块的能力。本文将通过对比 SeaweedFS 与 JuiceFS 在设计与功能上的差异&#xff0c;以帮助读者进行更适合自己的选择。 SeaweedFS 系统结构 S…

【树】平衡二叉搜索树的介绍与构建

二叉平衡搜索树一、平衡二叉搜索树的概述1. 平衡二叉树的性质2. 平衡二叉树的最小节点数&#xff08;公式及其原理&#xff09;a. 树高度和深度的区别b. 原理二、平衡二叉树的创建和调整1. 节点2. 旋转四种姿态a. LL旋转b. RR旋转c. LR旋转d. RL旋转2. 节点的插入3. 节点的删除…

[转]深度学习 Transformer架构解析

原文链接&#xff1a;https://blog.csdn.net/mengxianglong123/article/details/1262614791.1 Transformer的诞生2018年10月&#xff0c;Google发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT模型横空出世, 并横扫N…

分享5款后台收到的推荐最多的软件

最近后台收到好多小伙伴的私信&#xff0c;今天继续推荐五款小工具&#xff0c;都是免费使用的&#xff0c;大家可以去试试看。 1.视频压缩——Moo0 VideoMinimizer 一款完全免费的视频压缩软件&#xff0c;能够有效的将视频压缩到最小&#xff0c;同时还不改变视频画质很清晰…

基于SpringBoot的房屋租赁管理系统的设计与实现

基于SpringBoot的房屋租赁管理系统的设计与实现 1 绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&…

Java程序设计-基于Java高校社团管理系统

摘 要功能需求系统的功能实现摘 要 当前&#xff0c;大多数高校的社团信息管理都是采用纸质档案的方式来管理的&#xff0c;这样不仅不能长期的保存信息&#xff0c;而且在数据的查找上带来很大的不方便。在目前的网络技术和计算机技术的普及和信息管理的迅速发展&#xff0c;…

【MySQL】你知道的MySQL中的集合函数有哪些呢?

集合函数排名AVG&#xff08;&#xff09;函数COUNT()函数SUM&#xff08;&#xff09;函数MAX&#xff08;&#xff09;函数 和 MIN&#xff08;&#xff09;函数总结大家好&#xff0c;我是小冷。 上一篇写了 看看ChatGPT是如何回答面试官的问题的&#xff1f; 地址是&#x…

MySQL数据库06——条件查询(WHERE)

MySQL条件查询&#xff0c;主要是对数据库里面的数据按照一定条件进行筛选&#xff0c;主要依靠的是WHERE语句进行。 先来了解一下基础的条件运算。 关系运算符 逻辑运算符 逻辑运算符优先级&#xff1a;NOT>AND>OR&#xff0c;关系运算符>逻辑运算符 SQL特殊运算符…

公司常用的Project管理工具

目录 1.svn 2.reviewBoard 3.禅道 4.瘦终端 1.svn svn主要是对代码的管理&#xff0c;保证代码的同步开发。 svn的搭建方法https://www.cnblogs.com/ftx3q/p/15340160.html 2.reviewBoard reviewBoard代码审查工具&#xff0c;所有工程师写的代码上传到reviewBoard&#x…

前端将本地代码项目上传到gitee上

文章目录前言一、gitee建立仓库&#xff1f;1.登入并新建账号2.填写仓库信息3.传项目前言 因为以前跟B站做了一些项目&#xff0c;想上传到gitee仓库保留。所以写下此文章。前端项目 一、gitee建立仓库&#xff1f; 1.登入并新建账号 2.填写仓库信息 readme文件是否选择&#…

C++类基础(十)

运算符重载 struct Str {int val 3; }; Str Add(Str x, Str y) {Str z;z.val x.val y.val;return z; } int main() {int val1 2;int val2 3;int val3 val1 val2; //分别对val1和val2求值然后相加Str x;Str y;Str z Add(x, y); //同样的功能&#xff0c;但是写法冗杂St…

【GPLT 二阶题目集】L2-004 这是二叉搜索树吗?

参考文章&#xff1a;L2-004. 这是二叉搜索树吗&#xff1f;-PAT团体程序设计天梯赛GPLT 作者&#xff1a;柳婼&#xff08;非常感谢!!!&#xff09; 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树&#xff1a;对于任一结点&#xff0c; 其左子树中所有结点的键值小于…

基于时间序列的 基-2 FFT算法程序

gitee链接 &#xff1a;基于时间序列的 基-2 FFT算法程序 我的 gitee 程序目前没有公开&#xff0c;目前仅是给自己的程序做一个备份的目的。 但是大家可以使用我博客贴出来的程序&#xff0c;二者是一样的。 文章目录1.程序使用方法2.代码3.验证1.程序使用方法 1.先补零至2的…

html(二)基础标签

一 HTML中的注释 重点&#xff1a; 在哪写注释? 注释的形式? vs code和webstorm都可以通过 ctrl / 进行单行注释和取消注释 ① html中注释的形式 1) html文档中单行和多行注释是"<!-- -->" -->html2) 在html文档中,script标签…

volatile 关键字

1.volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 "内存可见性". 代码在写入 volatile 修饰的变量的时候, 改变线程工作内存中volatile变量副本的值将改变后的副本的值从工作内存刷新到主内存 代码在读取 volatile 修饰的变量的时候 从主内存中读取vol…