【算法练习Day45】最长公共子序列不相交的线最大子数组和

news2025/1/15 22:47:05

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 最长公共子序列
  • 不相交的线
  • 最大子数组和
  • 总结:

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

最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode)

最长公共子序列,与上一期最后一道的区别在于本题要求的是两个数组的可以删除中间数据的最长公共的部分。是删除中间部分的多于元素后,在不改变数据顺序情况下得到的最长公共子序列,

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

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)

这道题和第一道题思路一模一样,为什么这么说呢?它是求两数组相等数字俩俩连线,且不能相交,其实就是求两个数组的最长递增子序列,有多长,有多长就有几个连线。至于题中说的一个数据只能被连一次,那是一定的。例如第一个数组的某数据和第二个数组的连续两个数据都相等,但是根据递推公式它们的连线条数是根据之前连线条数有关,也就是说如果之前没有一样的数据,连线条数是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)

这道题以前讲贪心算法时候,做过一次,我们再用动态规划思想,做一次,解题的思路不是很难,但是细节需要注意。起初我在想这道题的解法时候,递推公式也像上面的题一样,写成两个,但后来遇到全负数的数组却无法解出。

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/1197758.html

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

相关文章

Linux输入与输出设备的管理

计算机系统中CPU 并不直接和设备打交道&#xff0c;它们中间有一个叫作设备控制器&#xff08;Device Control Unit&#xff09;的组件&#xff0c;例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样&#xff0c;它们知道如何应对硬盘…

如何在 Windows 11 上恢复丢失的文件?(4种方法)

在 Windows 11 设备上丢失重要文件感觉就像一场噩梦。这是您希望时光倒流并撤消意外删除或避免那些意外的系统故障的时刻之一。这种情况带来的挫败感和焦虑感简直难以承受。但是&#xff0c;嘿&#xff0c;不要绝望&#xff01;我们随时为您提供帮助。 在这本真诚的指南中&…

CA 陪你看 Ignite | 聚焦 Microsoft Ignite 2023

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

android studio 修改图标

Android Studio 修改图标 简介 Android Studio 是一款由谷歌推出的用于开发 Android 应用程序的集成开发环境&#xff08;IDE&#xff09;。在开发过程中&#xff0c;我们可以根据自己的需求修改 Android Studio 的图标&#xff0c;以个性化我们的开发环境。 本文将介绍如何在…

XC1010非隔离型、低成本的PWM功率开关、AC-DC 220V转5V 200mA小电流芯片

XC1010是一款非隔离型、高集成度且低成本的PWM功率开关&#xff0c;适用于降压型和升降压型电路。 XC1010采用高压单晶圆工艺&#xff0c;在同一片晶圆上集成有 500V 高压 MOSFET 和采用开关式峰值电流模式控制的控制器。在全电压输入的范围内可以保证高精度的 5V 默认…

LoRAShear:微软在LLM修剪和知识恢复方面的最新研究

LoRAShear是微软为优化语言模型模型(llm)和保存知识而开发的一种新方法。它可以进行结构性修剪&#xff0c;减少计算需求并提高效率。 LHSPG技术&#xff08; Lora Half-Space Projected Gradient&#xff09;支持渐进式结构化剪枝和动态知识恢复。可以通过依赖图分析和稀疏度…

【3】Gradle-快速入门使用【Gradle概念】

目录 【3】Gradle-快速入门使用【Gradle概念】Gradle任务查看可用任务了解任务探索任务依赖性 依赖关系了解传递依赖关系查看项目依赖项添加版本目录 【可选】 插件使用插件查看插件提供的任务配置插件 增量构建启用缓存使用构建缓存步骤总结 个人主页: 【⭐️个人主页】 需要您…

【tg】 5 :线程切换

manager 可以切到 其他类的其他线程去执行。线程切换 先通过 networkmgr 线程 执行 ,但是传递了Manager 自己的线程 进去。在networkmgr 的network线程中,获取到stats数据,然后扔给 manager的线程thread ,去posttask 还行这个task里调用了mediamanager 的perform ,在media…

研究方法——案例研究设计与方法

作者&#xff1a;罗伯特K.殷 &#xff08;一&#xff09;计划&#xff1a;如何把握何处、何时用案例研究方法 1.问题&#xff1a; 按照作者的观点&#xff0c;案例研究1984年之后才逐渐得到重视&#xff0c;可是在数据信息有效收集的时代&#xff0c;几乎所有的经典都是以案例…

[西湖论剑 2022]real_ez_node

文章目录 前置知识EJS模板注入&#xff08;CVE-2022-29078&#xff09;原型链污染漏洞 &#xff08;CVE-2021-25928&#xff09;HTTP响应拆分攻击&#xff08;CRLF&#xff09; 解题过程代码审计构造payload 前置知识 EJS模板注入&#xff08;CVE-2022-29078&#xff09; EJS…

LeetCode18-四数之和

注意!其中nums数值的范围,四个加一起会导致INT溢出,long类型则是64位的整数,因此不会导致溢出,这也是本题难点之一! 大佬解法(拿捏offer的解法) 经过反复的代码比对和Debug,发现大佬解法的速度之快体现在足足7个if语句的剪枝,其中包括了2个关键性的去重的if语句以及2个关键性…

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证概述笔记重复数字IO的问题想法手工实现程序实现确定要摘掉的数字重合线自动化测试的问题测试程序的场景测试程序的运行效果测试程序实现备注END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-14…

推荐这款机器学习的特征筛选神器!

大家好&#xff0c;特征选择是机器学习建模流程中最重要的步骤之一&#xff0c;特征选择的好坏直接决定着模型效果的上限&#xff0c;好的特征组合甚至比模型算法更重要。除了模型效果外&#xff0c;特征选择还有以下几点好处&#xff1a; 提高模型性能并降低复杂性&#xff08…

Spring Cloud学习(六)【统一网关 Gateway】

文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种&#xff1a; gatewayzuul …

到底是什么是Python?语言的核心是什么?

文章目录 前言一、为什么提出python编程的核心是什么&#xff1f;二、Python需要REPL&#xff1f;三、Python的哪些部分需要被视为“Python”&#xff1f;四、需要多少兼容性才能有用&#xff1f;Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学…

计算机网络技术

深入浅出计算机网络 微课视频_哔哩哔哩_bilibili 第一章概述 1.1 信息时代的计算机网络 1. 计算机网络各类应用 2. 计算机网络带来的负面问题 3. 我国互联网发展情况 1.2 因特网概述 1. 网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系 如图所示&#xff0…

Windows11跳过联网激活 跳过登陆操作

1 背景 笔者使用VirtualBox时安装Win11&#xff0c;初始化的配置提示需要注册账户才能进行下一步操作&#xff0c;于是去查了一下发现有办法绕过&#xff0c;方法就是断网oobe\ByPassNRO.cmd&#xff0c;试了一下发现可以&#xff0c;便有了这篇文章。 2 流程 开机之前&…

【星海随笔】SDN neutron (二) Neutron-plugin(ML2)

Neutron架构之Neutron-plugin Core-plugin(ML2)篇 Neutron-server接收两种请求&#xff1a; REST API请求&#xff1a;接收REST API请求&#xff0c;并将REST API分发到对应的Plugin&#xff08;L3RouterPlugin&#xff09;。 RPC请求&#xff1a;接收Plugin agent请求&#…

QT 布局管理综合实例

通过一个实例基本布局管理&#xff0c;演示QHBoxLayout类、QVBoxLayout类及QGridLayout类效果 本实例共用到四个布局管理器&#xff0c;分别是 LeftLayout、RightLayout、BottomLayout和MainLayout。 在源文件“dialog.cpp”具体代码如下&#xff1a; 运行效果&#xff1a; Se…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…