【动态规划】子序列问题(一)

article/2025/8/11 19:25:44

📝前言说明:

  • 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串问题两个数组dp问题(一)
两个数组的dp问题(二)01背包问题
完全背包二维的背包问题
其他

题目

  • 什么是子序列
  • 300. 最长递增子序列
    • 优质解
  • 376. 摆动序列
    • 个人解
  • 673. 最长递增子序列的个数
    • 优质解
  • 646. 最长数对链
    • 个人解


什么是子序列

子序列:数组中不连续的⼀段,即:每个位置的数字都有选 / 不选两种情况

300. 最长递增子序列

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/
在这里插入图片描述


优质解

思路:

  • dp[i]:以i位置为结尾的所有子序列中的最长严格递增子序列
  • 状态转移:构成以i位置为结尾的子序列有两种情况
    • 子序列长度为 1 :单独i位置成一个子序列
    • 子序列长度大于1:依据i紧跟的前一个元素可以分为i种情况(但实际上子序列的数量远远大于 i,只不过我们描述到这种程度已经可以解题了)
      • ... nums[i - 1], nums[i]
      • ... nums[i - 2],nums[i]
      • nums[0], nums[i]
  • 状态转移方程
    • 长度为 1dp[i] = 1;
    • 长度大于1:我们设计紧跟nums[i]的元素的下标为j(在一次循环里:i - 1 >= j >=0):
      • if(nums[j] < nums[i]) dp[i] = dp[j] + 1
      • j遍历一遍,找到最大值max_dpdp[i] = max_dp
  • 初始化:每个元素对应dp的最小值:1
  • 填表顺序:从左往右
  • 返回值:dp表中的最大值

代码:

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

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)


376. 摆动序列

题目链接:https://leetcode.cn/problems/wiggle-subsequence/description/
在这里插入图片描述

个人解

思路:

  • 和上一题一样
  • 一个 2 * n 的 dp数组(第 i 个位置有两种状态 ><
  • dp[0][i] :记录第 i 个位置为<时,以i位置为结尾的最长摆动数组

用时:12:00
屎山代码:

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

时间复杂度: O ( n 2 ) O(n^2) O(n2),用贪心策略可以把时间降到 O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)


673. 最长递增子序列的个数

题目链接:https://leetcode.cn/problems/number-of-longest-increasing-subsequence/description/
在这里插入图片描述


优质解

思路:

  • dp[i]: 以 i 位置结尾的最递增子序列
  • cnt[i]: 以该位置结尾的最长递增子序列的个数

代码:

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1);vector<int> cnt(n, 1);int maxlen = 1, ans = 1;for(int i = 1; i < n; i++){for(int j = i - 1; j >= 0; j--){// 获得以 i 位置结尾的最长子序列和 最长子序列的个数if(nums[i] > nums[j]){if(dp[i] < dp[j] + 1){dp[i] = dp[j] + 1;cnt[i] = cnt[j]; // i 的前面为 j 但是,这代表的子串可不只一个}else if(dp[i] == dp[j] + 1){cnt[i] += cnt[j];}}}// 更新 ansif(dp[i] > maxlen){ans = cnt[i];maxlen = dp[i];}else if(dp[i] == maxlen)ans += cnt[i];}return ans;}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)


646. 最长数对链

题目链接:https://leetcode.cn/problems/maximum-length-of-pair-chain/description/
在这里插入图片描述

个人解

思路:

  • 按第一个元素的大小排一下序
  • 因为后面pair的第二个元素要大于前面pair的第一个元素,所以后pair的第一个元素肯定也要大于前pair的第一个元素

用时:5:00
屎山代码:

class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {int n = pairs.size();sort(pairs.begin(), pairs.end());vector<int> dp(n, 1);int ans = 1;for(int i = 0; i < n; i++){for(int j = i - 1; j >= 0; j--){if(pairs[i][0] > pairs[j][1])dp[i] = max(dp[i], dp[j] + 1);}ans = max(ans, dp[i]);}return ans;}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!


http://www.hkcw.cn/article/AcPNjocKQa.shtml

相关文章

一文读懂Ingress-Nginx以及实践攻略

一文读懂Ingress-Nginx以及实践攻略 目录 1 概念 1.1 什么是Ingress? 1.1.1 主要功能:1.2 Ingress的组件1.3 什么是ingress-nginx1.4 ingress-nginx优点和限制1.5 版本兼容性矩阵2 实践: Ingress nginx部署 2.1 使用helm部署ingress-nginx 2.1.1 安装和配置Helm2.1.2 配置和…

一、【专栏启动篇】:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图

【专栏启动篇】&#xff1a;为什么是 Django Vue3&#xff1f;测试平台的技术选型与架构蓝图 前言一、为什么是 Django Vue3&#xff1f;二、测试平台的架构设计蓝图三、测试平台模块功能概述 结语 前言 一个高效、稳定、易用的测试平台&#xff0c;不仅能够帮助团队提升测试…

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务

1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”&#xff0c;就是“身份鉴定”“权限判断”。涉及的技术有&#xff1a;OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权&#xff0c;使用Jwt签发Access Token和Refresh Token&#xff0c;并管理token…

基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战

目录 前言 一、PostGIS空间求解 1、相邻的求解 二、后台程序实现 1、数据查询的实现 2、API接口实现 三、WebGIS可视化实现 1、空间面展示 2、增加面标注 3、图例展示 4、与缅甸距离较近的区县信息 四、总结 前言 云南&#xff0c;这个位于中国西南边陲的省份&…

【带小白做项目】如何在SpringBoot项目中接入AI大模型?

随着chatGPT的兴起&#xff0c;越来越多的应用接入了AI大模型&#xff0c;那么我们要怎么在自己的项目中接入AI大模型呢&#xff1f;本节我们一起做一个简单的demo来尝试一下。 一 为什么要在项目中接入大模型 1. 增强业务功能和用户体验 AI 大模型&#xff08;如 GPT、BERT…

【计算机主板架构】ATX架构

一、引言 在计算机的世界里&#xff0c;主板就如同一个城市的基础设施&#xff0c;承载着各种重要的组件并协调它们的工作。而ATX&#xff08;Advanced Technology Extended&#xff09;架构的主板&#xff0c;自问世以来&#xff0c;一直在计算机硬件领域占据着举足轻重的地位…

精选了几道MySQL的大厂面试题,被提问的几率很高!

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

搞定mysql的 行转列(7种方法) 和 列转行

一、行转列 1、使用case…when…then 2、使用SUM(IF()) 生成列 3、使用SUM(IF()) 生成列 WITH ROLLUP 生成汇总行 4、使用SUM(IF()) 生成列&#xff0c;直接生成汇总结果&#xff0c;不再利用子查询 5、使用SUM(IF()) 生成列 UNION 生成汇总行,并利用 IFNULL将汇总行标题…

高并发场景下的热点key问题探析与应对策略

目录 一、问题描述 二、发现机制 三、解决策略分析 &#xff08;一&#xff09;解决策略一&#xff1a;多级缓存策略 客户端本地缓存 代理节点本地缓存 &#xff08;二&#xff09;解决策略二&#xff1a;多副本策略 &#xff08;三&#xff09;解决策略三&#xff1a;热点…

SQL Server——SSMS中数据库、表的创建

目录 一、引言 二、数据库、表的创建与删除 &#xff08;一&#xff09;方法一&#xff1a;在SSMS控制平台上进行创建 &#xff08;二&#xff09;方法二&#xff1a;使用 SQL 代码实现对数据库和表的创建 三、SQL 和 T-SQL 一、引言 在学习数据库的过程中&#xff0c;初…

spring AOP详解

文章目录 AOP1 环境准备1.1 工程及接口创建1.2 工程存在的问题1.2.1 问题1.2.2 解决思路 2 AOP面向切面编程2.1 AOP概述2.2 AOP原理分析 3 基于注解的AOP3.1 入门示例3.2 使用流程3.3 切入点表达式3.4 练习3.5 通知类型 AOP ​ AOP&#xff08;Aspect Orient Programming&…

重看Spring聚焦ApplicationContext分析

目录 一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 &#xff08;二&#xff09;ApplicationContext 结构类图 二、ApplicationContext根接口 &#xff08;一&#xff09;源码展示 &#xff08;二&#xff09;分析说明 三、子接口Configu…

【MySQL安装】—报错“Can‘t connect to local MySQL server through socket ‘varlibmysqlmysql.sock‘”

项目场景&#xff1a; 执行 “mysql -uroot -p” 命令&#xff0c;进入MySQL数据库。 问题描述&#xff1a; 报错&#xff1a; Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock 原因分析&#xff1a; /var/lib/mysql路径下缺少mysql.sock文件。 …

本地部署Vanna实战,快速解决NLP2SQL

一、背景 ​ 随着DeepSeek的火爆&#xff0c;基于AI的应用也如雨后春笋般迸发出来&#xff0c;如何根据用户的一句话来找到用户所需要的信息&#xff0c;采用传统的方式无法通过模糊匹配等实现复杂的业务场景&#xff0c;故探索一种新的思路来实现信息获取。Text2SQL将自然语言…

【MySQL】基础操作

MySQL(二)基础操作 一、数据库操作 1.创建库 2.查看库 3.选中库 4.删除库 二、表操作 1.创建表 1.1[comment 注释]&#xff1a; 1.2,...&#xff1a; 2.查看表 2.1查看所有表 2.2查看表结构 3.删除表 三、记录操作 1.插入记录 1.1全列插入 1.2指定列插入 1.3…

嵌入式硬件篇---蜂鸣器

蜂鸣器是一种常用的电子发声元件&#xff0c;主要分为有源蜂鸣器和无源蜂鸣器两类。它们在结构、工作原理、驱动方式、应用场景等方面存在显著差异。以下是详细介绍&#xff1a; 一、核心定义与结构差异 1. 有源蜂鸣器 定义&#xff1a; “有源” 指内部自带振荡电路&#x…

工程的焊接技术

一、焊接设备与材料 焊接设备&#xff1a;对应不同焊接方法&#xff0c;如焊条电弧焊设备包括电焊机、焊钳、接地夹等。 焊接材料 焊条 分类&#xff1a;按熔渣性质分为碱性焊条&#xff08;低氢型&#xff09;和酸性焊条。 选用原则&#xff1a;根据焊接场景选择&#xff0c;…

HackMyVM-Teacher

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 01:02 EDT Nmap scan report for 192.168.43.1 Host is up (0.0084s latency). MAC Address: C6:45:66:05:91:88 (Unknow…

AE矩形工具蒙版找不到椭圆形工具怎么办?

是不是也跟我一样遇到了这个问题 &#xff1f; 还以为是自己安装的版本有问题。其实并没有。 只需要选择矩形工具&#xff0c;鼠标左键&#xff0c;长按1s即可有其他选项 这样就解决啦

Linux 学习-模拟实现【简易版bash】

1、bash本质 在模拟实现前&#xff0c;先得了解 bash 的本质 bash 也是一个进程&#xff0c;并且是不断运行中的进程 证明&#xff1a;常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后&#xff0c;bash 会创建子进程&#xff0c;并进行程序替换 证明&#x…