当前位置: 首页 > news >正文

代码随想录第五十二天——最长递增子序列,最长连续递增序列,最长重复子数组

leetcode 300. 最长递增子序列

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

  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. 遍历顺序
    从前向后遍历
for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);}if (dp[i] > result) result = dp[i]; // 取长的子序列
}

整体代码如下:

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

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

leetcode 674. 最长连续递增序列

题目链接:最长连续递增序列
本题要求子序列是连续递增,所以只需要比较 nums[i]和 nums[i-1]

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() == 0) return 0;int result = 1;vector<int> dp(nums.size() ,1);for (int i = 1; i < nums.size(); i++) {if (nums[i] > nums[i - 1]) { // 连续记录dp[i] = dp[i - 1] + 1;}if (dp[i] > result) result = dp[i];}return result;}
};

时间复杂度:O(n)
空间复杂度:O(n)

leetcode 718. 最长重复子数组

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

  1. dp数组及下标的含义
    dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]
  2. 确定递推公式
    当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1
  3. dp数组初始化
    dp[i][0] 和dp[0][j]初始化为0
  4. 遍历顺序
    外层for循环遍历A,内层for循环遍历B

版本一:二维数组

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 res = 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;}if (dp[i][j] > res) res = dp[i][j];}}return res;}
};

时间复杂度:O(n × m),n 为A长度,m为B长度
空间复杂度:O(n × m)

版本二:滚动数组

dp[i][j]由dp[i - 1][j - 1]推出,压缩为一维数组,dp[j]由dp[j - 1]推出。
遍历B数组的时候,就要从后向前遍历,这样避免重复覆盖

class Solution {
public:int findLength(vector<int>& A, vector<int>& B) {vector<int> dp(vector<int>(B.size() + 1, 0));int res = 0;for (int i = 1; i <= A.size(); i++) {for (int j = B.size(); j > 0; j--) {if (A[i - 1] == B[j - 1]) {dp[j] = dp[j - 1] + 1;} else dp[j] = 0; // 注意这里不相等的时候要有赋0的操作if (dp[j] > res) res = dp[j];}}return res;}
};

时间复杂度:O(n × m),n 为A长度,m为B长度
空间复杂度:O(m)

http://www.lryc.cn/news/277589.html

相关文章:

  • 【大数据架构】OLAP实时分析引擎选型
  • 代码随想录刷题题Day29
  • CVE-2023-51385 OpenSSH ProxyCommand命令注入漏洞
  • 如何寻找到相对完整的真正的游戏的源码 用来学习?
  • 数模学习day11-系统聚类法
  • SpringBoot+Redis实现接口防刷功能
  • TensorRT加速推理入门-1:Pytorch转ONNX
  • springboot常用扩展点
  • 19道ElasticSearch面试题(很全)
  • 向爬虫而生---Redis 拓宽篇3 <GEO模块>
  • Vue项目里实现json对象转formData数据
  • leetcode刷题记录
  • SpringMVC通用后台管理系统源码
  • 深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解
  • 备战2024美赛数学建模,文末获取历史优秀论文
  • Java加密解密大全(MD5、RSA)
  • C语言程序设计考试掌握这些题妥妥拿绩点(写给即将C语言考试的小猿猴们)
  • 编译ZLMediaKit(win10+msvc2019_x64)
  • JS-基础语法(一)
  • 18款Visual Studio实用插件(更新)
  • 三、java线性表(顺序表、链表、栈、队列)
  • PiflowX-MysqlCdc组件
  • 2023春季李宏毅机器学习笔记 03 :机器如何生成文句
  • dplayer播放hls格式视频并自动开始播放
  • 使用Vivado Design Suite平台板、将IP目录与平台板流一起使用
  • PACS医学影像报告管理系统源码带CT三维后处理技术
  • 介绍几种常见的质数筛选法
  • Qt/QML编程学习之心得:Linux下读写GPIO(23)
  • Unity中URP下深度图的线性转化
  • Low Poly Cartoon House Interiors