代码随想录算法训练营第四十四天|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的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

华为ensp实验二--mux vlan的应用

一、实验内容 1.实验要求&#xff1a; 在交换机上创建三个vlan&#xff0c;vlan10、vlan20、vlan100&#xff0c;将vlan100设置为mux-vlan&#xff0c;将vlan10设置为group vlan&#xff0c;将vlan20设置为separate vlan&#xff1b;实现vlan10的设备在局域网内可以进行互通&…

Hadoop + Hive + Apache Ranger 源码编译记录

背景介绍 由于 CDH&#xff08;Clouderas Distribution Hadoop &#xff09;近几年已经开始收费并限制节点数量和版本升级&#xff0c;最近使用开源的 hadoop 搭了一套测试集群&#xff0c;其中的权限管理组件用到了Apache Ranger&#xff0c;所以记录一下编译打包过程。 组件…

物联网对商业领域的影响

互联网彻底改变了通信方式&#xff0c;并跨越了因地理障碍造成的人与人之间的鸿沟。然而&#xff0c;物联网&#xff08;IoT&#xff09;的引入通过使设备能够连接到互联网&#xff0c;改变了设备的功能。想象一下&#xff0c;你的闹钟连接到互联网&#xff0c;并且能够用你的声…

PYNQ 框架 - 中断(INTR)驱动

目录 1. 简介 2. 分析 2.1 Block Design 2.2 AXI Timer 2.2.1 IP 基本信息 2.2.2 IP 地址空间 2.2.3 级联模式 2.2.4 生成/捕获模式 2.3 AXI Interrupt 2.3.1 IP 基本信息 2.3.2 IP 地址空间 2.3.3 相关概念 2.3.4 参数配置 2.3.5 中断确认寄存器 3. PYNQ 代码 …

HTB:Photobomb[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行端口开放扫描 再次使用nmap对靶机开放端口进行脚本、服务扫描 使用ffuf进行简单的子域名扫描 使用浏览器直接访问该域名 选取一个照片进行下载&#xff0c;使用Yakit进行抓包 USER_FLAG&#xff1a;a9afd9220ae2b5731…

ts枚举 enum

枚举&#xff08; enum &#xff09;可以定义⼀组命名常量&#xff0c;它能增强代码的可读性&#xff0c;也让代码更好维护。调用函数时传参时没有任何提示&#xff0c;编码者很容易写错字符串内容。并且⽤于判断逻辑的是连续且相关的⼀组值&#xff0c;那此时就特别适合使用枚…

Android Studio | 修改镜像地址为阿里云镜像地址,启动App

在项目文件的目录下的 settings.gradle.kts 中修改配置&#xff0c;配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…

场景解决之mybatis当中resultType= map时,因某个字段为null导致返回的map的key不存在怎么处理

1、场景:通过查询数据表将返回结果封装到map当中返回,因某个字段为null,导致map当中key丢失 <select id"queryMyBonus" parameterType"com.cn.entity.student" resultType "map">SELECTb.projectName as "projectName",b.money…

初识算法 · 位运算常见总结(1)

目录 前言&#xff1a; 位运算基本总结 部分题目代码 前言&#xff1a; ​本文的主题是位运算&#xff0c;通过常见的知识点讲解&#xff0c;并且会附上5道简单的题目&#xff0c;5道题目的链接分别为&#xff1a;191. 位1的个数 - 力扣&#xff08;LeetCode&#xff09; 1…

国信证券造访图为科技,共探科技与资本交融新契机

在当今时代背景下&#xff0c;科技与资本的交融&#xff0c;是推动企业发展和产业升级的强大动力&#xff0c;两者相辅相成&#xff0c;共同塑造未来经济的新格局。今日&#xff0c;图为科技深圳总部迎来了国信证券董事总经理于吉鑫一行的造访。 这不是一场简单的会面&#xff…

计算机网络:运输层 —— TCP/IP运输层中的两个重要协议

文章目录 TCP 协议工作方式建立连接&#xff08;三次握手&#xff09;释放连接&#xff08;四次挥手&#xff09; 首部格式 UDP 协议首部格式适用场景 TCP 与 UDP 的对比无连接的UDP和面向连接的TCP对单播、多播和广播的支持情况对应用层报文的处理对数据传输可靠性的支持情况U…

机器学习:决策树——ID3算法、C4.5算法、CART算法

决策树是一种常用于分类和回归问题的机器学习模型。它通过一系列的“决策”来对数据进行分类或预测。在决策树中&#xff0c;每个内部节点表示一个特征的测试&#xff0c;每个分支代表特征测试的结果&#xff0c;而每个叶节点则表示分类结果或回归值。 决策树工作原理 根节点&…

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建 &#xff08;1&#xff09;虚拟机 ubuntu 要使用桥接模式&#xff0c;不能使用其他模式 &#xff08;2&#xff09;通过网线将PC和开发板网口直连:这样的连接&#xff0c;开发板是无法连接外网的 &#xff08;3&#xff…

ReactPress:重塑内容管理的未来

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress&#xff1a;重塑内容管理的未来 在当今信息爆炸的时代&#xff0c;一个高效、易用的内容管理系统&#xff0…

WebRTC视频 01 - 视频采集整体架构

一、前言&#xff1a; 我们从1对1通信说起&#xff0c;假如有一天&#xff0c;你和你情敌使用X信进行1v1通信&#xff0c;想象一下画面是不是一个大画面中有一个小画面&#xff1f;这在布局中就叫做PIP&#xff08;picture in picture&#xff09;&#xff1b;这个随手一点&am…

SQL Servers审核提高数据库安全性

什么是SQL Server审核&#xff1f; SQL Server审核包括追踪和审查发生在SQL Server上的所有活动&#xff0c;检测潜在的威胁和漏洞&#xff0c;能够监控和记录对服务器设置的每次更改。此外&#xff0c;可以帮助管理员可以轻松地追踪数据库中特定表中的所有服务器活动&#xf…

STM32+AI语音识别智能家居系统

基于 STM32 和 AI 语音识别的智能家居系统的详细硬件和软件设计&#xff0c;包括各个模块的详细描述和代码示例。 一、硬件设计 1. 微控制器&#xff08;STM32&#xff09;&#xff1a; 选择 STM32F7 系列或更高性能的芯片&#xff0c;如 STM32F767ZIT6&#xff0c;以满足处理…

在 ASP.NET Core 6.0 中使用 Swagger/OpenAPI 丰富 Web API 文档

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/89961435 介绍 在选择或尝试与 API 集成之前&#xff0c;大多数开发人员都会查看其 API 文档。保持 API 文档更新以反映软件更改是一项挑战&#xff0c;需要时间和精力。对于 Web API&#xff0c;我们…

萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?

在现代安防监控领域&#xff0c;对于数据存储和视频处理的需求日益增长&#xff0c;特别是在需要长时间、高稳定性监控的环境中&#xff0c;选择合适的存储设备和监控系统显得尤为重要。本文将深入探讨监控硬盘与普通硬盘的区别&#xff0c;并详细介绍海康私有化视频平台EasyCV…