代码随想录算法训练营第四十四天|Day44 动态规划

1143.最长公共子序列

视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQ

https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int longestCommonSubsequence(char* text1, char* text2) {int text1Len = strlen(text1);int text2Len = strlen(text2);int dp[text1Len + 1][text2Len + 1];memset(dp, 0, sizeof (dp));for (int i = 1; i <= text1Len; ++i) {for (int j = 1; j <= text2Len; ++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[text1Len][text2Len];
}

学习反思

两个字符串的最长公共子序列的长度。其中使用了动态规划的思想。首先,定义了一个宏函数max,用来返回两个数中的较大值。然后,使用strlen函数获取两个字符串的长度。接下来,定义了一个二维数组dp,用来保存最长公共子序列的长度。数组的行数为text1Len + 1,列数为text2Len + 1。然后,使用memset函数将dp数组初始化为0。接下来,使用两个for循环遍历两个字符串的字符。如果两个字符相等,说明可以将这两个字符加入到最长公共子序列中,所以dp[i][j]的值为dp[i-1][j-1]+1。如果两个字符不相等,说明不能将这两个字符同时加入到最长公共子序列中,所以dp[i][j]的值为dp[i-1][j]和dp[i][j-1]中的较大值。最后,返回dp[text1Len][text2Len],即为最长公共子序列的长度。这段代码的时间复杂度为O(mn),其中m为text1的长度,n为text2的长度。因为需要遍历两个字符串的所有字符。空间复杂度为O(mn).

1035.不相交的线

视频讲解:https://www.bilibili.com/video/BV1h84y1x7MP

https://programmercarl.com/1035.%E4%B8%8D%E7%9B%B8%E4%BA%A4%E7%9A%84%E7%BA%BF.html

思路

int maxUncrossedLines(int* nums1, int nums1Size, int* nums2, int nums2Size) {int dp[nums1Size + 1][nums2Size + 1];memset(dp, 0, sizeof(dp));for (int i = 1; i <= nums1Size; i++) {for (int j = 1; j <= nums2Size; j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1; } else {dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1]; }}}return dp[nums1Size][nums2Size];
}

学习反思

两个数组之间的最大不相交连线数。其中使用了动态规划的思想。首先,定义了一个二维数组dp,用来保存最大不相交连线数。数组的行数为nums1Size + 1,列数为nums2Size + 1。然后,使用memset函数将dp数组初始化为0。接下来,使用两个for循环遍历两个数组的元素。如果两个元素相等,说明可以将这两个元素连线,所以dp[i][j]的值为dp[i-1][j-1]+1。如果两个元素不相等,说明不能将这两个元素连线,所以dp[i][j]的值为dp[i-1][j]和dp[i][j-1]中的较大值。最后,返回dp[nums1Size][nums2Size],即为最大不相交连线数。这段代码的时间复杂度为O(mn),其中m为nums1的长度,n为nums2的长度。因为需要遍历两个数组的所有元素。空间复杂度为O(mn)。

53. 最大子序和

视频讲解:https://www.bilibili.com/video/BV19V4y1F7b5

https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html

思路

int maxSubArray(int* nums, int numsSize) {if (numsSize == 0) {return 0; }int maxCurrent = nums[0]; int maxGlobal = nums[0];   for (int i = 1; i < numsSize; i++) {maxCurrent = (nums[i] > maxCurrent + nums[i]) ? nums[i] : (maxCurrent + nums[i]);if (maxCurrent > maxGlobal) {maxGlobal = maxCurrent; }}return maxGlobal; 
}

学习反思

求解数组中的最大子数组和问题,使用了动态规划的思想。首先,判断数组的长度是否为0,如果为0,则直接返回0。然后,定义两个变量maxCurrent和maxGlobal,分别用来表示当前子数组的最大和和全局最大和。初始时,它们都被赋值为数组的第一个元素。接下来,使用一个for循环遍历数组的元素。在循环中,通过比较当前元素和当前元素加上前一个最大子数组和的值,选择一个较大的值作为新的最大子数组和。这样可以保证最大子数组和的连续性。然后,判断新的最大子数组和是否大于全局最大和,如果是,将其更新为全局最大和。最后,返回全局最大和,即为数组中的最大子数组和。段时间复杂度为O(n),其中n为numsSize,即数组的长度。因为只需要遍历一次数组。空间复杂度为O(1)。

392.判断子序列

https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html

思路

bool isSubsequence(char* s, char* t) {int sIndex = 0;int tIndex = 0;while (t[tIndex] != '\0') {if (s[sIndex] == t[tIndex]) {sIndex++;}if (s[sIndex] == '\0') {return true;}tIndex++;}return s[sIndex] == '\0';
}

学习反思

判断字符串s是否是字符串t的子序列。在这段代码中,使用了两个指针sIndex和tIndex来分别指向s和t的字符位置。代码的逻辑是,首先初始化sIndex和tIndex为0,然后开始循环,循环条件是t[tIndex]不等于字符串结束符'\0'。在循环中,首先判断s[sIndex]是否等于t[tIndex],如果相等,则sIndex自增1,表示已经匹配了s的一个字符。然后,判断s[sIndex]是否为结束符'\0',如果是,则表示s已经全部匹配完了,是t的子序列,返回true。否则,tIndex自增1,继续循环。如果循环结束后,s[sIndex]仍然为结束符'\0',则表示s已经全部匹配完了,是t的子序列,返回true。否则,返回false。这段代码的时间复杂度为O(n),其中n为字符串t的长度。

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

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

相关文章

Hook小程序

下载&#xff1a; https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 配置&#xff1a; pip install -r requirements 实现&#xff1a; 开启小程序开发者模式&#xff0c;类似浏览器F12 效果&#xff1a; 使用&#xff1a; 退出微信&#xff0c;进入安装的目录…

Mysql 8迁移到达梦DM8遇到的报错

在实战迁移时&#xff0c;遇到两个报错。 一、列[tag]长度超出定义 在mysql中&#xff0c;tag字段的长度是varchar(20)&#xff0c;在迁移到DM8后&#xff0c;这个长度不够用了。怎么解决&#xff1f; 在迁移过程中&#xff0c;“指定对象”时&#xff0c;选择转换。 在“列映…

PyQt5 在线环境搭建

1.记得升级pip&#xff0c;升级后就会一路畅通的安装&#xff0c;无论是在终端通过命令安装&#xff0c;还是在pycharm中&#xff0c;通过设置&#xff0c; python -m pip install --upgrade pip 升级后安装pyqt5,pyqt5-tools,pyqt5-stubs。 命令安装 pycharm->设置&…

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平 导航适用性强&#xff0c;几乎所有类型的网站都可以使用&#xff0c;设计难度较低。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在…

将数据上传至hdfs的两种方式:java代码上传、将数据放入kafka中,通过flume抽取

目录 1、 生成一条&#xff0c;使用 java 代码将数据放入hdfs上传。 2、 生成一条&#xff0c;编写kafka生产者&#xff0c;将数据放入kafka。kafka source-->flume -->hdfs sink 场景题&#xff1a; 使用 java 代码随机生成学生信息&#xff0c;学生的学号从 0001 开…

【vue】echarts地图添加蒙版图片,多图层地图实现天气信息展示

实现原理&#xff1a;多层图层叠加实现复杂的信息展示。 <template><div class"wrapper"><el-drawertitle"天气信息":modal"iszz":visible.sync"weatherinfo":direction"direction"><drawer:labelnam…

100+SCI科研绘图系列教程(R和python)

科研绘图系列&#xff1a;箱线图加百分比点图展示组间差异-CSDN博客科研绘图系列&#xff1a;箱线图加蜜蜂图展示组间数据分布-CSDN博客科研绘图系列&#xff1a;小提琴图和双侧小提琴图展示组间差异-CSDN博客科研绘图系列&#xff1a;组间差异的STAMP图的ggplot2实现-CSDN博客…

QT鼠标事件

QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目&#xff0c;在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件&#xff0c;选择 C Class 自定义类名Mylabel&#xff0c;选择基类Base …

“双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!

作为一年一度的消费盛会&#xff0c;2024年“双十一”购物狂欢节早已拉开帷幕。蹲守直播间、在主播热情介绍中点开链接并加购&#xff0c;也已成为大多数人打开“双11”的重要方式。然而&#xff0c;在这火热的购物氛围背后&#xff0c;主播频频“翻车”、优质主播稀缺、客服响…

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

题目练习之二叉树那些事儿(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

【STL栈和队列】:高效数据结构的应用秘籍

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;为我们提供了多种容器&#xff0c;其中 stack&#xff08;栈&#xff09;和 queue&#xff08;队列&#xff09;是非常常用的两种容器。 根据之前C语言实现的栈和队列&#xff0c;&#xff08;如有遗忘&#xff0c;…

Zabbix 7 最新版本安装 Rocky Linux 8

前言 本实验主要在Rocky Linux 中安装Zabbix&#xff0c;其他centos8、Debian、Ubuntu、Alma Linux都可以安装&#xff0c;就是在中间件有点不同。Nginx就要配置一下&#xff0c;官网给的教程也算是很规范的&#xff0c;就是在MySQL上要自己安装&#xff0c;他没有告诉我们&am…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

【GPTs】Email Responder Pro:高效生成专业回复邮件

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Email Responder Pro主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; Email Craft 是一款专门用于…

2024下半年软考系统架构师案例分析题试题与答案--ROS机器人操作系统

一、知识点回顾 ROS(Robot Operating System)是一个用于编写机器人软件的框架。它提供了一系列的工具和库,帮助开发者创建复杂的、可以在多种操作系统上运行的机器人应用程序。 ROS的主要特点包括: 分布式计算能力:ROS提供了一种方式让多个计算机或设备协同工作,通过…

探索Copier:Python项目模板的革命者

文章目录 **探索Copier&#xff1a;Python项目模板的革命者**1. 背景介绍&#xff1a;为何Copier成为新宠&#xff1f;2. Copier是什么&#xff1f;3. 如何安装Copier&#xff1f;4. 简单库函数使用方法4.1 创建模板4.2 从Git URL创建项目4.3 使用快捷方式4.4 动态替换文本4.5 …

密码学知识点整理二:常见的加密算法

常用的加密算法包括对称加密算法、非对称加密算法和散列算法。 对称加密算法 AES&#xff1a;高级加密标准&#xff0c;是目前使用最广泛的对称加密算法之一&#xff0c;支持多种密钥长度&#xff08;128位、192位、256位&#xff09;&#xff0c;安全性高&#xff0c;加密效率…

大模型就业收入高吗?大模型入门到精通,收藏这篇就够了

目前&#xff0c;已经可以说人工智能&#xff08;AI&#xff09;是推动社会进步和产业升级的重要力量。 其中&#xff0c;AI大模型作为人工智能领域的核心技术之一&#xff0c;正引领着新一轮的技术革命。 2024年&#xff0c;AI大模型开发工程师无疑成为了IT行业中最炙手可热…

Kubebot:一款Google云平台下的Slackbot安全测试工具

Kubebot 今天给大家介绍的是一款名叫Kubebot的安全测试Slackbot&#xff0c;该工具基于Google 云平台搭建&#xff0c;并且提供了Kubernetes后端。 项目架构 数据流 1.API请求由Slackbot发起&#xff0c;发送至API服务器&#xff0c;API服务器以Kubernetes(K8s)集群中的Docke…