代码随想录算法训练营第五十三天 |1143.最长公共子序列、1035.不相交的线、53. 最大子序和动态规划

news2024/9/24 19:17:48

一、1143.最长公共子序列 

题目链接/文章讲解:代码随想录

视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili

 思考:

1.确定dp数组(dp table)以及下标的含义

dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]

2.确定递推公式

两种情况:

如果text1[i - 1]与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;

如果text1[i - 1]与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的

代码如下:

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

3.dp数组的初始化

统一初始为0

4.确定遍历顺序

从前向后,从上到下       

  

5.举例推导dp数组

代码实现: 

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()];
    }
};
  • 时间复杂度: O(n * m),其中 n 和 m 分别为 text1 和 text2 的长度
  • 空间复杂度: O(n * m)

二、1035.不相交的线

题目链接/文章讲解:代码随想录

视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线_哔哩哔哩_bilibili

思考:本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!

代码实现(与1143.最长公共子序列相同 ): 

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()];
    }
};
  • 时间复杂度: O(n * m),其中 n 和 m 分别为nums1 和 nums2的长度
  • 空间复杂度: O(n * m)

三、53. 最大子序和动态规划

题目链接/文章讲解:代码随想录

视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibili

思考:

1.确定dp数组(dp table)以及下标的含义

dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]

2.确定递推公式

dp[i]只有两个方向可以推出来:

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和
dp[i] = max(dp[i - 1] + nums[i], nums[i]);

3.dp数组的初始化

dp[0] = nums[0]

4.确定遍历顺序  

  从前向后

5.举例推导dp数组

代码实现: 

贪心:

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

动态规划:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 0) return 0;
        vector<int> dp(nums.size());
        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]); // 状态转移公式
            if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值
        }
        return result;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

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

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

相关文章

关键词搜索天猫商品列表数据,天猫商品列表数据接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取天猫网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;天猫网站…

pytest + yaml 框架 -56. 输出日志优化+allure报告优化

前言 v1.4.8 版本优化接口请求和响应输出日志&#xff0c;生成的allure报告也按步骤优化request和response详情日志 优化日志 用例 test_log1: -name: log1request:url: http://127.0.0.1:8000/api/test/demomethod: GETvalidate:- eq: [status_code, 200]- eq: ["cod…

从 0 到 1 打造企业数字化运营闭环

打造企业数字化运营闭环是现代企业发展的必然趋势。它涉及到信息技术、数据分析、流程优化等多个方面&#xff0c;通过有效整合和运用这些资源&#xff0c;可以实现从0到1的全面数字化转型。 下面是一个详细的介绍&#xff0c;包括步骤、关键要素和实施策略。 一、了解需求和…

吉客云对接打通金蝶云星空销售单查询接口与销售出库新增接口

吉客云对接打通金蝶云星空销售单查询接口与销售出库新增接口 接通系统&#xff1a;吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求&#xff0c;重新定位、全新设计推出的换代产品&#xff0c;从业务数字化和组织数字化两个方向出发&#x…

图扑 HT for Web 风格属性手册教程

图扑软件明星产品 HT for Web 是一套纯国产化独立自主研发的 2D 和 3D 图形界面可视化引擎。HT for Web&#xff08;以下简称 HT&#xff09;图元的样式由其 Style 属性控制&#xff0c;并且不同类型图元的 Style 属性各不相同。为了方便查询和理解图元的 Style 属性&#xff0…

第二证券:5.5G时代将至 算力基建迎政策助力

昨日&#xff0c;A股全线低开&#xff0c;三大股指盘中均跌超1%&#xff0c;盘中冲高回落&#xff0c;午后逐渐止跌。到收盘&#xff0c;沪指跌0.44%报3096.92点&#xff0c;深成指微跌0.03%报10106.96点&#xff0c;创业板指跌0.26%报1998.61点&#xff0c;两市算计成交7700元…

腾讯系数藏停摆一年 玩家被甩在维权路上

暴雷、维权、清退是过去一年数藏行业的常态。小平台跑了&#xff0c;腾讯这样的大厂以关停、退款终止运营数藏业务时&#xff0c;吃相也不好看。 在黑猫投诉平台上&#xff0c;幻核被投诉退款缓慢&#xff0c;曾经发行过数字藏品的QQ音乐被投诉违背发行时承诺的“持有356天后可…

嵌入式学习笔记(52)ADC的引入

11.1.1什么是ADC (1)ADC:analog digital converter,AD转换&#xff0c;模数转换&#xff08;也就是模拟转数字&#xff09; (2)CPU本身是数字的&#xff0c;而外部世界变量&#xff08;如电压、温度、高度、压力&#xff09;都是模拟的&#xff0c;所以需要用CPU来处理这些外…

【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

多测师肖sir_高级金牌讲师_python之 字符、索引、切片、列表、集合004

python之 字符、索引、切片、列表、集合 一、索引 索引在公司中一般叫下标或角标 定义&#xff1a;我们可以直接使用索引来访问序列中的元素&#xff0c;同时索引可分为正向和负向两种&#xff0c;而切片也会用到索引&#xff0c;下面放上一个图&#xff0c;有助于大 家理解正…

Docker 网络访问原理解密

How Container Networking Works: Practical Explanation 这篇文章讲得非常棒&#xff0c;把docker network讲得非常清晰。 分为三个部分&#xff1a; 1&#xff09;docker 内部容器互联。 2&#xff09;docker 容器 访问 外部root 网络空间。 3&#xff09;外部网络空间…

MySQL数据库技术笔记(6)

新建两张表&#xff0c;班级表和学生表&#xff0c;因为班级表与学生表之间是 1 对多的关系&#xff0c;需要将少的表的主键放置多的 表中称为外键。 添加班级信息 添加学生信息并关联对应的班级 连接查询&#xff0c;表示查询的时候关联多张表进行查询 最终两张表的交叉连接…

面试算法24:反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。例如&#xff0c;把图4.8&#xff08;a&#xff09;中的链表反转之后得到的链表如图4.8&#xff08;b&#xff09;所示。 分析 由于节点j的next指针指向了它的前一个节…

别用==比较包装类

前两天工作把代码合并到主分支时&#xff0c;被公司的安全监测机制拦截了&#xff0c;一看是因为用了来比较Integer类型。 在阿里开发手册中&#xff0c;有这样一条&#xff1a;在包装类进行比较的时候&#xff0c;要用equals方法&#xff0c;而不是。 具体的原因下面也讲解的…

提升爬虫IP时效:解决被封IP的难题

在进行数据采集时&#xff0c;经常会遇到被目标网站封禁IP的情况&#xff0c;这给爬虫系统带来了困扰。本文将介绍如何提升爬虫IP的时效&#xff0c;解决被封IP的难题&#xff0c;帮助您顺利进行数据采集&#xff0c;不再受限于IP封禁。 第一步&#xff1a;使用爬虫IP 使用爬虫…

飞书应用机器人文件上传

背景&#xff1a; 接上一篇 flask_apscheduler实现定时推送飞书消息&#xff0c;当检查出的异常结果比较多的时候&#xff0c;群里会有很多推送消息&#xff0c;一条条检查工作量会比较大&#xff0c;且容易出现遗漏。   现在需要将定时任务执行的结果记录到文件&#xff0c;…

ESPHome不经过HA设备1直接控制设备2

目录 1.公共配置文件2.设备2:台灯3.控制器(http.post)4.获取状态(http.get) 1.公共配置文件 #wifi.yaml wifi: networks:- ssid: "123"password: "www.123.com"- ssid: "456"password: "www.123.com"# 当连接不上指定wifi,开启热点配…

idea-java: 错误: 无效的源发行版:16

1.CtrlAltShiftS 2.jdk版本对应好 3.modules中一栏sdk 4.modules中一栏源码 5.所有modules修改 6.修改项目配置 ctrlalts,修改为指定版本&#xff0c;应用即可

codesys【按钮】

1用于控制bool信号。 1声明全局变量 2绑定该变量 运行后&#xff0c;按钮就能控制这个bool变量了。 2按钮【自复位】 3按钮【锁位】

订购OV通配符SSL证书

目前很多单位申请OV通配符SSL证书&#xff0c;一头雾水&#xff0c;其实操作还是比较简单的。 订购条件OV通配符组织单位&#xff0c;申请之前需要确定好单位全程&#xff0c;并且在第三方一些主流的公共平台可以查到主体信息。 然后根据以下步骤操作就可以了&#xff1a; 1…