代码随想录算法训练营Day49|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

最长递增子序列

300. 最长递增子序列 - 力扣(LeetCode)

dp[i]为到当前位置i为止的最长递增子序列的长度,所以dp[nums.size()-1]并不一定是整个数组的最长递增子序列的长度。这里需要注意,但这个dp[i]怎么来的,我确实没想到。。。

由于是到当前位置i为止的最长递增子序列的长度,所以当当前的nums[i]大于先前元素nums[j],

dp[i] = max(dp[i],dp[j] + 1)

dp[i] = 1,当全乱序的情况下,最长递增子序列长度为1,也是初始值。

从前向后遍历,嵌套循环遍历,时间复杂度为O(n^2)。

最后返回的是dp[i]中元素的最大值。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if (nums.size() == 0) // 如果数组为空返回0
            return 0; 
        vector<int> dp(nums.size(), 1); 
        // dp[i]将存储以nums[i]结尾的最长递增子序列的长度
        for (int i = 1; i < nums.size(); i++) { // 遍历nums数组,从第二个元素开始
            for (int j = 0; j < i; j++) { // 遍历i之前的所有元素
                if (nums[i] > nums[j]) // 如果当前元素大于j位置的元素
                    dp[i] = max(dp[i], dp[j] + 1); // 更新dp[i]为dp[i]和dp[j]+1中的较大值
            }
        }
        return *max_element(dp.begin(), dp.end()); // 使用*max_element函数找到dp数组中的最大值并返回
        // 这个最大值就是最长递增子序列的长度
    }
}; 

此处注意max_element返回的是最大值的迭代器,所以加*号解引用得到值的大小。

算法的时间复杂度为O(n^2),空间复杂度为O(n)。

最长连续递增序列

674. 最长连续递增序列 - 力扣(LeetCode)

此题相比上题简单许多,贪心也很好做,存储一个计数指示,当前元素大于先前元素,指示++,否则,指示为1,最后返回最大的计数值。

用dp思路的话。

dp[i]表示以先前元素到i的连续递增序列的长度,注意这里不考虑最长的情况

如果nums[i] > nums[i-1],dp[i] = dp[i-1]+1,否则dp[i] = 1。

将所有元素初始化为1。

从前向后遍历。

最终返回dp数组的最大值

class Solution { 
public:
    int findLengthOfLCIS(vector<int>& nums) { // 类的一个公有成员函数,用于计算最长连续递增子序列的长度
        vector<int> dp(nums.size(), 1); // 创建一个动态数组dp,大小与输入的nums相同,初始化所有值为1
        // dp[i]将存储以nums[i]结尾的最长连续递增子序列的长度
        int maxlength = 1; // 初始化最长递增子序列的长度为1
        for (int i = 1; i < nums.size(); i++) { // 遍历nums数组,从第二个元素开始
            if (nums[i] > nums[i - 1]) // 如果当前元素大于前一个元素
                dp[i] = dp[i - 1] + 1; // 则dp[i]等于dp[i-1]加1,表示递增子序列长度增加
            maxlength = max(dp[i], maxlength); // 更新最长递增子序列的长度
        }
        return maxlength; // 返回计算得到的最长连续递增子序列的长度
    }
};

算法的时间复杂度为O(n),空间复杂度为O(n)。

最长重复子数组

. - 力扣(LeetCode)

具体思路看下面代码随想录的网址链接。

代码随想录 (programmercarl.com)

dp[i][j]表示以nums1[i-1]和nums2[j-1]为结尾的两个数组的最长公共连续子数组的长度。

当nums1[i-1] == nums[j-1]时,dp[i][j] = dp[i-1][j-1] + 1。

dp[0][0] = 0

遍历从i  = 1开始到nums1.size(),j从1到nums2.size(),嵌套循环。这里从1开始的原因在于我们需要比较nums[i-1]和nums[j-1],而其实dp[0][0]是没有意义的,但可以用来推导后续的dp值。

最后返回dp数组中最大值即为两个数组的最长公共连续子数组的长度。

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        // 创建一个二维动态数组dp,用于存储子问题的解
        // dp[i][j]表示以nums1[i-1]和nums2[j-1]结尾的最长公共连续子数组的长度
        vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1, 0));
        int result = 0; // 用于存储最终的最长公共连续子数组的长度

        // 遍历数组nums1和nums2
        for(int i = 1; i <= nums1.size(); i++){ // 注意i从1开始,i=0没有实质意义
            for(int j = 1; j <= nums2.size(); j++){ // 同理j也从1开始
                // 如果当前两个数字相等
                if(nums1[i-1] == nums2[j-1]){
                    // 更新dp[i][j]为dp[i-1][j-1]加1
                    // 这意味着以nums1[i-1]和nums2[j-1]结尾的最长公共连续子数组的长度
                    // 等于以nums1[i-2]和nums2[j-2]结尾的最长公共连续子数组的长度加1
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                // 如果以nums1[i-1]和nums2[j-1]结尾的最长公共连续子数组的长度大于当前结果
                // 更新结果为dp[i][j]
                if(dp[i][j] > result)
                    result = dp[i][j];
            }
        }
        // 返回最终的最长公共连续子数组的长度
        return result;
    }
};

时间复杂度是O(nm),其中n和m分别是两个数组的长度。空间复杂度也是O(nm),因为需要一个二维数组来存储所有子问题的解。

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

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

相关文章

[DALL·E 2] Hierarchical Text-Conditional Image Generation with CLIP Latents

1、目的 CLIP DDPM进行text-to-image生成 2、数据 (x, y)&#xff0c;x为图像&#xff0c;y为相应的captions&#xff1b;设定和为CLIP的image和text embeddings 3、方法 1&#xff09;CLIP 学习图像和文本的embedding&#xff1b;在训练prior和decoder时固定该部分参数 2&a…

RabbitMQ的WorkQueues模型

WorkQueues模型 Work queues&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于消息的消费速度。长此以往&#xff0c;消息就会堆积越来越多&#xff0c;…

运维.Linux下执行定时任务(中:Cron的常用替代方案)

运维系列 Linux下执行定时任务&#xff08;中&#xff1a;Cron的常用替代方案&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAd…

Android集成mapbox教程

目录 简介准备工作创建Token系统开发简介 Mapbox是来自美国的一家为开发者提供地图服务和开发工具的开放平台。Mapbox以开源的形式构建了矢量瓦片技术生态,开发了矢量切片工具、瓦片服务传输框架。Mapbox的底图平台非常受欢迎,特别是开发者和学生群体,可以使用免费的开源软…

FileNotFoundError: Cannot find DGL C++ graphbolt library at ...

FileNotFoundError: Cannot find DGL C graphbolt library at ...-CSDN博客https://blog.csdn.net/weixin_44017989/article/details/137658749

2024最新算法:鳗鱼和石斑鱼优化(Eel and grouper optimizer,EGO)算法求解23个函数,MATLAB代码

一、算法介绍 鳗鱼和石斑鱼优化器&#xff08;Eel and grouper optimizer&#xff0c;EGO&#xff09;是2024年提出的一种智能优化算法&#xff0c;EGO算法的灵感来自海洋生态系统中鳗鱼和石斑鱼的共生相互作用和觅食策略。 参考文献&#xff1a; [1]A. Mohammadzadeh, S. Mi…

学会python——统计文件中文字出现次数(python实例九)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、统计文本文件中单词频率 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计…

浅谈逻辑控制器之ForEach控制器

浅谈逻辑控制器之ForEach控制器 ForEach控制器是一个非常实用的功能&#xff0c;它允许用户遍历某个变量的所有值&#xff0c;并为每个值执行控制器内的子采样器或逻辑。这对于处理从先前请求&#xff08;如CSV Data Set Config、JSON Extractor、Regular Expression Extracto…

设计工程师在FMEA团队中的职责是什么?

在复杂多变的工程环境中&#xff0c;FMEA&#xff08;失效模式与影响分析&#xff09;已成为确保产品质量、提高系统可靠性和降低潜在风险的关键工具。FMEA团队由多个专业领域的专家组成&#xff0c;其中设计工程师作为团队的重要成员&#xff0c;扮演着至关重要的角色。本文&a…

boost asio异步服务器(4)处理粘包问题tlv

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…

BP神经网络

BP神经网络 BP神经网络是一种多层前馈神经网络&#xff0c;它通过反向传播算法进行训练&#xff0c;旨在最小化损失函数&#xff0c;从而对输入数据进行精确的分类或回归预测。 背景 BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概…

SAP ABAP 之容器

文章目录 前言一、案例介绍/笔者需求二、自定义容器 a.实例化对象 b.自定义容器效果演示 c.Copy Code 三、自适应容器 a.常用 必须 参数理解 b.METRIC 度量单位 c.RATIO 百分比尺寸 d.STYLE 容器…

商业银行流动性创造指标数据集(2005-2022)

数据简介&#xff1a;中文数据库商业银行流动性创造指标参考邓伟等老师&#xff08;2022&#xff09;的做法&#xff0c;常备借贷便利与中期借贷便利数据来源于中国人民银行发布的《中国货币政策执行报告》。银行层面的微观指标主要来源于BankScope数据库和CSMAR数据库&#xf…

Spring Cloud Netflix:构建强大微服务生态系统的利器

Spring Cloud Netflix是一组集成框架&#xff0c;它将Netflix的多个开源组件整合到Spring Boot应用程序中&#xff0c;使得构建云原生应用程序变得更加简单。这些组件包括用于服务发现和注册的Eureka&#xff0c;断路器模式的实现Hystrix&#xff0c;用于API网关的Zuul&#xf…

springboot家乡特色推荐系统 LW +PPT+源码+讲解

3系统需求分析 3.1系统功能 通过前面的功能分析可以将家乡特色推荐系统的功能分为管理员和用户两个部分&#xff0c;系统的主要功能包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;文章分类管理&#xff0c;文章分享管理&#xff0c;系统管理等内容。任何用户…

【c语言】二级指针

1&#xff0c;定义 本质还是从指针的角度去理解&#xff0c;只不过存的指针的值 2&#xff0c;使用方法

第三方软件连接虚拟机

第三方软件连接虚拟机 1 查看本机VM&#xff08;VMware&#xff09;虚拟机网段2 开启虚拟机系统&#xff0c;修改网卡配置3 重新打开网络并测试连通性4 打开VM虚拟机网络开关5 通过第三方软件建立连接6 可能遇到的问题 1 查看本机VM&#xff08;VMware&#xff09;虚拟机网段 子…

38.控制功能实现

上一个内容&#xff1a;37.添加简易的调试功能 以 37.添加简易的调试功能 它的代码为基础进行修改 效果图&#xff1a; 下图红框位置的功能实现 Dlls项目中添加一个Dialog Dialog如下 然后给它添加一个类&#xff0c;MFC添加的类可能会报错添加 #include "afxdialogex.h…

煤矿智能巡检机器人:推动煤矿行业变革的关键力量

目前我国煤炭资源总量达到了2078.85亿吨&#xff0c;已探明储量为1432亿吨&#xff0c;煤矿能源现阶段还是我国重要的基础能源。而煤矿生产作业存在巨大危险&#xff0c;主要包括高温、高压、燃爆和有毒气体等环境因素&#xff0c;同时机械设备运转过程中潜藏着重大风险。这些危…

【Python/Pytorch - 网络模型】-- 高阶SVD算法

文章目录 文章目录 00 写在前面01 基于Python版本的高阶SVD算代码02 HOSVD 的步骤 00 写在前面 高阶奇异值分解&#xff08;Higher-Order SVD&#xff0c;HOSVD&#xff09;是一种将传统的奇异值分解&#xff08;SVD&#xff09;扩展到高阶张量的方法。它能够将一个高阶张量分…