C++ day52 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1:300 最长递增子序列

题目链接:最长递增子序列

对题目的理解

找出整数数组中最长严格递增子序列的长度

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i]:以nums[i]为结尾的最长递增子序列的长度

递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾

2)递推公式

3)dp数组初始化

根据dp数组定义,dp[i]至少长度是1,最少包含nums[i]  ,dp[i]的最大值不一定是在dp[nums.size()-1],可能出现在各个位置,因此需要遍历一遍

4)遍历顺序

求递增子序列,dp[i]依赖于前面的元素与当前数值进行比较的结果更新dp[i]的值,i从小到大遍历

for(i=1;i<nums.size();i++)  注意i从1开始,因为dp[0]代表以第一个元素结尾,最长递增子序列的长度就是1

for(j=0;j<i;j++)//j用于遍历从0到j的所有元素,j从小到大遍历,从大到小遍历均可,只要把0~i内的元素全部遍历了就行

5)打印dp数组

代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //定义并初始化dp数组
        vector<int> dp(nums.size(),1);
        int result = 1;
        //递推
        for(int i=1;i<nums.size();i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp[i] = max(dp[j]+1,dp[i]);
            }
            result = max(result,dp[i]);//以每一个元素结尾的长度都遍历一遍,求长度的最大值
        }
        return result;
    }
};
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n)

题目2:674 最长连续递增序列

题目链接:最长连续递增序列

对题目的理解

整数数组未经排序,找到数组中最长且连续递增的子序列,返回该序列的长度

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i]:以i结尾的最长连续递增子序列的长度,注意这里只是说了以i结尾,不一定以0开始哟,注意本题的最大长度不一定是在dp[nums.szie()-1],可能出现在各个位置,所以需要遍历一遍求最大值

2)递推公式

不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关

3)dp数组初始化

至少有1个元素,长度是1 ,dp[i]=1

4)遍历顺序

根据递推公式,i依赖于i-1,所以,从前往后遍历

for(i=1;i<nums.size();i++), 注意i从1开始

5)打印dp数组

代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        //定义并初始化dp数组
        vector<int> dp(nums.size(),1);
        int result = 1;
        for(int i=1;i<nums.size();i++){
            if(nums[i]>nums[i-1]) dp[i]=dp[i-1]+1;
            result = max(result,dp[i]);
        }
        return result;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

贪心算法

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int count=1;
        int result = 1;
        for(int i=1;i<nums.size();i++){
            if(nums[i]>nums[i-1]) count++;//连续递增,count++
            else count = 1;//不连续递增,count从1开始计算
            result = max(result,count);
        }
        return result;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

题目3:718 最长重复子数组

题目链接:最长重复子数组

对题目的理解

返回两个整数数组中公共的且长度最长的子数组长度(子数组就是连续子序列)

动态规划

动规五部曲

1)dp数组及下标i的含义

使用二维dp数组表示两个数组的所有比较情况

dp[i][j]:以i-1为结尾的nums1和以j-1为结尾的nums2最长重复子数组的长度

注意:本题的最大长度不一定在dp[nums1.size()-1][nums2.size()-1],可能出现在各个位置,所以需要再遍历一遍,求最大值

2)递推公式

根据递推公式的定义,dp[i][j]的状态只能由dp[i-1][j-1]推导出来,if(nums1[i-1]==nums2[j-1]) dp[i][j]=dp[i-1][j-1]+1  两个数组同时回退所以只能是dp[i-1][j-1]+1,不能是dp[i][j-1]也不能是dp[i-1][j]

3)dp数组初始化

根据dp数组定义(以i-1结尾,以j-1结尾),dp[i][0]无意义状态  0-1无意义;同理,dp[0][j]无意义状态  0-1无意义,为了方便递推公式,将二者初始化为0,最长子数组长度应该从0往上加

其他的下标的dp值初始化为任意值均可(因为计算递推公式之后会被覆盖),为了代码简洁,将dp全初始化为0

4)遍历顺序

先遍历两个数组中的哪一个都可以

for(i=1;i<=nums1.size();i++){

for(j=1;j<=nums2.size();j++)}

注意从1开始遍历(根据递推公式),且条件是小于等于,因为dp数组的定义是[i][j]代表以i-1,j-1为结尾,只有等于,才能遍历到数组中的最后一个元素,nums1.size()-1,nums2.size()-1

题目要求长度最长的子数组的长度。所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

5)打印dp数组

代码

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        //定义并从初始化dp数组
        vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1));
        for(int i=0;i<nums1.size();i++){
            dp[i][0]=0;
        }
        for(int j=0;j<nums2.size();j++){
            dp[0][j]=0;
        }
        int result=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;
                result = max(result,dp[i][j]);
            }
        }
        return result;        
    }
};

初始化简便一些

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        //定义并从初始化dp数组
        vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
        int result=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;
                result = max(result,dp[i][j]);
            }
        }
        return result;        
    }
};
  • 时间复杂度:O(n × m),n 为A长度,m为B长度
  • 空间复杂度:O(n × m)

     若将dp[i][j]数组定义为nums1以i结尾和nums2以j结尾,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,也是同样要把dp[0][j]初始化为1,如下图

代码

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        //定义并从初始化dp数组
        vector<vector<int>> dp(nums1.size(),vector<int>(nums2.size(),0));
        for(int i=0;i<nums1.size();i++) if(nums1[i]==nums2[0]) dp[i][0]=1;
        for(int j=0;j<nums2.size();j++) if(nums2[j]==nums1[0]) dp[0][j]=1;
        int result = 0;
        for(int i=1;i<nums1.size();i++){
            for(int j=1;j<nums2.size();j++){
                if(nums1[i]==nums2[j])  dp[i][j]=dp[i-1][j-1]+1;
                result = max(result,dp[i][j]);
            }
        } 
        return result;
    }
};

上述代码会出现如下的错误

错误的原因是即使是上面的初始化更新了dp数组,dp数组中是1,但是最终返回了result,而result又是在for循环中,两个for循环都是从1开始记录,所以整个for循环并不包括初始化的那一列,那一行进行比较,所以最终返回的结果是0

将代码更改为如下:i=0与j=0,初始化的这一行和一列还是要在for循环中进行比较的

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        //定义并从初始化dp数组
        vector<vector<int>> dp(nums1.size(),vector<int>(nums2.size(),0));
        for(int i=0;i<nums1.size();i++) if(nums1[i]==nums2[0]) dp[i][0]=1;
        for(int j=0;j<nums2.size();j++) if(nums2[j]==nums1[0]) dp[0][j]=1;
        int result = 0;
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
                if(nums1[i]==nums2[j] && i>0 && j>0)  dp[i][j]=dp[i-1][j-1]+1;
                result = max(result,dp[i][j]);
            }
        } 
        return result;
    }
};

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

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

相关文章

初探Maven

文章目录 一、Maven概述二、安装配置Maven&#xff08;一&#xff09;下载Maven&#xff08;二&#xff09;安装Maven&#xff08;三&#xff09;配置Maven 三、IDEA里配置Maven&#xff08;一&#xff09;版本情况说明&#xff08;二&#xff09;配置构建工具Maven 一、Maven概…

PyQt6 QGroupBox分组框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计37条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Python 调用企业微信群机器人发送消息及文件

Python 操作企业微信群机器人。 企业微信群创建机器人 &#xff1a; 安装 requests json &#xff1a; pip install requests pip install json发送消息&#xff08;markdown&#xff09; import requests import json# 企业微信机器人发送文字 def send_markdown (message, …

el-table分页时多选数据的保存和回显

大致思路&#xff1a; 把所有选择的数据全部存到一个大数组中&#xff0c;切页的时候匹配原数据利用ref节点的.toggleRowSelection方法进行回显 具体步骤&#xff1a; 1、勾选和全选时需要判断是选中还是取消&#xff0c;然后更新大数组数据。 2、分页获取新数据之后匹配当…

初学Python基础后,如何制定学习计划?

如果你是Python小白&#xff0c;学完基础语法是个了不起的成就&#xff0c;但是接下来应该干嘛呢&#xff1f;你应该学习哪些内容&#xff1f;你应该如何规划你的Python学习路线&#xff1f; 其实这些问题的答案都取决于你的个人目标和兴趣。你想要用Python做什么&#xff1f;…

TIA博途中快速修改变量值的方法和技巧

TIA博途中快速修改变量值的方法和技巧 如下图所示,正常情况下选中该变量,然后右击选择“修改”—然后选择修改为0或1, 快速调试技巧: 如下图所示,鼠标选中该变量上方的“FALSE”,直接双击,系统会提示是否进行切换该变量的值, 点击“是”即可切换变量的值, 如下图所示,…

142. 环形链表 II

142. 环形链表 II 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;错误经验吸取 原题链接&#xff1a; 142. 环形链表 II https://leetcode.cn/problems/linked-list-cycle-ii/description/ 完成情况&#xff1a; 解题思路&#xff1a;…

CSS、JS文件无法正确加载至页面问题与解决

目录 1. 问题出现 2. 分析与解决 3. 总结 1. 问题出现 自己在写项目是时候&#xff0c;想启动浏览器查询首页面index.jsp的显示效果 预期效果应该是下面这样的&#xff1a; 但是实际上是这样的&#xff1a; 意思也就是说可能是关于CSS、JS相关的引入方面出了问题&#xff…

qt使用wimlib-imagex,做windows系统备份还原

wimlib-imagex是个第三方工具&#xff0c;可对系统映像进行操作&#xff0c;下载地址&#xff1a; https://wimlib.net/downloads/index.html 程序主要用到以下这两个文件&#xff1a;libwim-15.dll和wimlib-imagex.exe wimlib-imagex.exe的调用命令参数&#xff0c;可以通过…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后&#xff0c;设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径&#xff0c;并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

SAP中的新旧事务码

SAP中的新旧事务码 SAP随着新版本的发布&#xff0c;我们知道sap已经更新了很多的程序和TCODE。sap提供了很多新的TCODE来替换旧的TCODE&#xff0c;新TCODE有很多的新特性和新功能。在这个这种情况下&#xff0c;很多旧TCODE就会被废弃。我们如何查找这个替换呢&#xff1f; …

什么是国际语音呼叫中心?国际语音呼叫中心能干什么?

1.什么是国际语音呼叫中心&#xff1f; 国际语音呼叫中心是指利用语音技术提供咨询、客服、销售、市场调研等呼叫中心服务的一种解决方案。与传统的呼叫中心相比&#xff0c;国际语音呼叫中心采用了更加高效、智能的呼叫技术&#xff0c;通过应用智能语音识别技术、自然语言处…

图解通信原理(以太网通信及物理层工作原理)

偶尔看到一篇对phy与mac讲解清楚的优秀文章&#xff0c;因此记录下来&#xff0c;此文章转发自知乎图解通信原理&#xff08;以太网通信及物理层工作原理&#xff09; - 知乎 概述 以太网是一种计算机局域网通信技术&#xff0c;主要由介质访问层(MAC L2) 协议、物理层&#…

采购透明拼接屏,需要注意些什么

在采购透明拼接屏时&#xff0c;需要注意以下几点&#xff1a; 尺寸和分辨率&#xff1a;根据实际应用需求选择合适的尺寸和分辨率。如果用于商业展示&#xff0c;需要选择较大的屏幕尺寸和较高的分辨率&#xff0c;以提供更好的视觉效果和观看体验。 透明度&#xff1a;透明…

企业微信配置可信域名

首先去申请一个域名&#xff0c;然后将域名绑定到有公网ip的云服务器上&#xff0c;绑定到具体的网站&#xff1b;然后再企业微信&#xff0c;管理后台&#xff0c;点击具体的应用&#xff0c;进【网页授权及JS-SDK】&#xff1b;点击底部的【申请校验域名】点击下载文件&#…

从0到1实现Flink 实战实时风控系统的经验总结

随着互联网金融的快速发展&#xff0c;实时风控系统成为保障业务安全和用户信任的关键。本文将分享从零开始构建Flink实时风控系统的经验&#xff0c;并提供相关示例代码。 一、搭建Flink环境 首先&#xff0c;我们需要搭建Flink环境。以下是一些基本步骤&#xff1a; 安装Ja…

HNU-电路与电子学-2021期末A卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 本份卷子的参考性很高&#xff0c;这是2020级的期末考卷。题目都是很典型的&#xff0c;每一道题都值得仔细研究透。 特别注意&#xff1a;看得懂答案跟写得…

编译原理词法分析:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话&#xff0c;请记得给一个免费的赞哦&#xff08;收藏也不错&#xff09;&#xff01; 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

SSM项目实战-前端-将uid存放在pinia中

https://pinia.vuejs.org/zh/getting-started.html 1、安装pinia npm install pinia {"name": "pro20-schedule","private": true,"version": "0.0.0","type": "module","scripts": {"d…

《 金融业图数据库建设发展调研报告 》:政策技术双轮驱动 图数据库未来大有可为

加gzh“大数据食铁兽”&#xff0c;回复“20231204“&#xff0c;获取材料完整版 导读 为更好地了解我国金融业图数据库技术的应用现状及需求&#xff0c;发现行业共性问题&#xff0c;宣传成功经验&#xff0c;本报告组织了针对金融业图数据库建设发展的调研工作&#xff0…