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

目录

300.最长递增子序列

前言

思路

算法实现

 674. 最长连续递增序列

前言

思路

算法实现

718. 最长重复子数组

前言

思路

总结


300.最长递增子序列

题目链接

文章链接

前言

         在结束代码随想录中的股票问题后,又是一个新的专题,本题是子序列问题的第一题,子序列问题是动态规划解决的经典问题。

思路

        当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,利用动规五部曲进行分析:

1.确定dp数组及其下标含义:

        dp[i]表示i之前包括i以nums[i]为结尾的最长递增子序列的长度;

2.确认递推公式:

        位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。

        所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);

3.初始化dp数组:

        每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1;

4.确认遍历顺序:

        dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。

5.打印dp数组:

        输入:[0,1,0,3,2],dp数组的变化如下:

算法实现

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();if (n <= 1) return nums.size();vector<int> dp(n, 1);int result = 0;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1); }result = max(result, dp[i]);}return result;}
};

 674. 最长连续递增序列

题目链接

文章链接

前言

         本题相较于上一题,最大的区别在于“连续”,对于连续问题的处理必须要重点考虑相邻元素。

思路

        利用动规五部曲进行分析:

1.确定dp数组及其下标的含义:

        dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]

2.确定递推公式:

        如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。

        即:dp[i] = dp[i - 1] + 1;

3.dp数组初始化:

        依然是将dp数组初始化为1,因为至少它本身算一个;

4.确定遍历顺序:

        从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。

4.打印dp数组:

        已输入nums = [1,3,5,4,7]为例,dp数组状态如下:

        注意这里要取dp[i]里的最大值,所以dp[2]才是结果! 

算法实现

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() <= 1) return nums.size();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] = max(dp[i], dp[i - 1] + 1);result = max(result, dp[i]);}return result;}
};

        本题也可以利用贪心求解,每遇到nums[i] > nums[i - 1],count就++,否则就初始回1,代码如下:

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() <= 1) return nums.size();int result = 1;int count = 1;for (int i = 1; i < nums.size(); i++) {if (nums[i] > nums[i - 1]) count++;elsecount = 1;result = max(result, count);}return result;}
};

718. 最长重复子数组

题目链接
文章链接

前言

         本题与前面几题又不一样了,本题比较的是两个数组拥有的最长重复的子数组,因此不能仅仅再只针对一个数组,dp数组也要变成二维;

思路

        用二维数组可以记录两个字符串的所有比较情况,使用动规五部曲进行分析:

1.确定dp数组及其下标的含义:

        dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。

        之所以是以i - 1和j - 1为结尾是因为在初始化dp[0][j]和dp[i][0]的时候可以直接初始化为0,不用再通过两次循环遍历赋初值。

2.确定递推公式:

        根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

        A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;因此i和j要从1开始;

3.初始化dp数组:

        有dp数组的定义可知,dp[i][0]和dp[0][j]本身没有意义,为了后面的递推公式可以赋值为0,其他下标的初始意义不大,都会被递推公式更新,简便起见可以将dp数组初始化为0;

4.确定遍历循序:

        内侧循环和外层循环遍历i和j都可,题目要求长度最长的子数组的长度。所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

5.打印dp数组:

        拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下:

算法实现

class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {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;}
};

总结

        子序列问题第一天结束!

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

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

相关文章

每日五道java面试题之java基础篇(二)

第一题. 为什么说 Java 语⾔“编译与解释并存”&#xff1f; ⾼级编程语⾔按照程序的执⾏⽅式分为编译型和解释型两种。 简单来说&#xff0c;编译型语⾔是指编译器针对特定的操作系统将源代码⼀次性翻译成可被该平台执⾏的机器码&#xff1b;解释型语⾔是指解释器对源程序逐…

基于opencv-python模板匹配的银行卡号识别(附源码)

目录 介绍 数字模板处理 银行卡图片处理 导入数字模板 模板匹配及结果 介绍 我们有若干个银行卡图片和一个数字模板图片&#xff0c;如下图 我们的目的就是通过对银行卡图片进行一系列图像操作使得我们可以用这个数字模板检测出银行卡号。 数字模板处理 首先我们先对数…

Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

Java集合框架(包装类、泛型)

前言&#xff1a; 本篇文章我们来讲解Java中的集合框架&#xff0c;就相当于车轮子。Java是面向对象的语言&#xff0c;所以相对于C语言有自身优势&#xff0c;就比如现成的数据结构&#xff08;比如栈&#xff0c;队列&#xff0c;堆等&#xff09;。Java的集合框架大家也不用…

使用AI开发一个红包封面生成器

使用 VUE3&#xff0c;和 Express 开发一个红包封面。 生成效果如下 体验地址&#xff1a;https://hongbao.digitalmodel.top/

Web Services 服务 是不是过时了?创建 Web Services 服务实例

Web Services 是不是过时了&#xff1f; 今天是兔年最后一天&#xff0c;先给大家拜个早年 。 昨天上午视频面试一家公司需要开发Web Services 服务&#xff0c;这个也没有什么&#xff0c;但还需要用 VB.net 开发。这个是多古老的语言了&#xff0c;让我想起来了 10年 前 写 …

无人机应用场景和发展趋势,无人机技术的未来发展趋势分析

随着科技的不断发展&#xff0c;无人机技术也逐渐走进了人们的生活和工作中。无人机被广泛应用于很多领域&#xff0c;例如遥感、民用、军事等等。本文将围绕无人机技术的应用场景和发展趋势&#xff0c;从多角度展开分析。 无人机技术的应用场景 无人机在遥感方面的应用&…

C++之RTTI实现原理

相关系列文章 C无锁队列的原理与实现 如何写出高质量的函数&#xff1f;快来学习这些coding技巧 从C容器中获取存储数据的类型 C之多层 if-else-if 结构优化(一) C之多层 if-else-if 结构优化(二) C之多层 if-else-if 结构优化(三) C之Pimpl惯用法 C之RTTI实现原理 目录 1.引言…

Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

【从Python基础到深度学习】4. Linux 常用命令

1.配置root用户密码 root用户为系统默认最高权限用户&#xff0c;其他用户密码修改命令与root用户修改密码命令相同 sudo passwd root 2.添加用户&#xff08;henry&#xff09; sudo useradd -m henry -s /bin/bash 3.配置henry用户密码 Xshell下连接新用户&#xff08;hen…

小巨人大爆发:紧凑型大型语言模型效率之谜揭晓!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

图像处理常用算法—6个算子 !!

目录 前言 1、Sobel 算子 2、Isotropic Sobel 算子 3、Roberts 算子 4、Prewitt 算子 5、Laplacian算子 6、Canny算子 前言 同图像灰度不同&#xff0c;边界处一般会有明显的边缘&#xff0c;利用此特征可以分割图像。 需要说明的是&#xff1a;边缘和物体间的边界并不…

Django问题报错:TypeError: as_view() takes 1 positional argument but 2 were given

一、错误位置 from django.urls import pathfrom users_app.views import RegisterView, LoginView, LogoutViewapp_name users urlpatterns [path("register/", RegisterView.as_view, name"register"),path("login/", LoginView.as_view, n…

机器学习---学习与推断,近似推断、话题模型

1. 学习与推断 基于概率图模型定义的分布&#xff0c;能对目标变量的边际分布&#xff08;marginal distribution&#xff09;或某些可观测变量 为条件的条件分布进行推断。对概率图模型&#xff0c;还需确定具体分布的参数&#xff0c;称为参数估计或学习问 题&#xff0c;…

读千脑智能笔记08_人工智能的未来(下)

1. 机器智能存在的风险 1.1. “人工智能”这个名字应用到几乎所有涉及机器学习的领域 1.2. 技术专家对人工智能的态度也从“人工智能可能永远不会实现”快速转变为“人工智能可能在不久的将来毁灭所有人类” 1.3. 每一项新技术都可能会被滥用…

专业课135+总分400+西安交通大学815/909信号与系统考研电子信息与通信工程,真题,大纲,参考书。

经过将近一年的考研复习&#xff0c;终于梦圆西安交大&#xff0c;今年专业可815(和909差不多)信号与系统135&#xff0c;总分400&#xff0c;回想这一年的复习还是有很多经验和大家分享&#xff0c;希望可以对大家复习有所帮助&#xff0c;少走弯路。 专业课&#xff1a; 这…

18:蜂鸣器

蜂鸣器 1、蜂鸣器的介绍2、编程让蜂鸣器响起来3、通过定时控制蜂鸣器4、蜂鸣器发出滴滴声&#xff08;间歇性鸣叫&#xff09; 1、蜂鸣器的介绍 蜂鸣器内部其实是2个金属片&#xff0c;当一个金属片接正电&#xff0c;一个金属片接负电时&#xff0c;2个金属片将合拢&#xff…

大数据应用对企业的价值

目录 一、大数据应用价值 1.1 大数据技术分析 1.2 原有技术场景的优化 1.2.1 数据分析优化 1.2.2 高并发数据处理 1.3 通过大数据构建新需求 1.3.1 智能推荐 1.3.2 广告系统 1.3.3 产品/流程优化 1.3.4 异常检测 1.3.5 智能管理 1.3.6 人工智能和机器学习 二、大数…

【深度学习: ChatGPT 】经验教训:使用 ChatGPT 作为 ML 工程师一天

【深度学习&#xff1a; ChatGPT 】经验教训&#xff1a;使用 ChatGPT 作为 ML 工程师一天 介绍设置过程标杆ChatGPT 做机器学习ChatGPT 能否真正实施这些解决方案&#xff1f;结果结论 TLDR;在最近使用 AI 应用程序 ChatGPT 的用例激增中&#xff0c;我们询问它是否可用于改进…