【算法与数据结构】300、674、LeetCode最长递增子序列 最长连续递增序列

文章目录

  • 一、300、最长递增子序列
  • 二、674、最长连续递增序列
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、300、最长递增子序列

在这里插入图片描述

  思路分析

  • 第一步,动态数组的含义。 d p [ i ] dp[i] dp[i]代表 i i i之前包括以 i i i结尾的最长递增子序列的长度。我们在做递增比较的时候,两个子序列分别以 n u m s [ i ] nums[i] nums[i] n u m s [ j ] nums[j] nums[j]作为结尾。
  • 第二步,递推公式。位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
	if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
  • 第三步,元素初始化。dp数组中的所有元素至少为1,因此都初始化为1。
  • 第四步,递归顺序。一共有两层循环,外层循环遍历整个nums数组,里层循环遍历 [ 0 , i − 1 ] [0,i-1] [0,i1]的nums数组。如果当前的nums[i]>nums[j]那么我们取 [ 0 , i − 1 ] [0,i-1] [0,i1]中最大的长度作为 d p [ i ] dp[i] dp[i]的值。
  • 第五步,打印结果。 d p [ n u m s . s i z e ( ) − 1 ] dp[nums.size()-1] dp[nums.size()1]未必是最大的,因此需要筛选出最大的结果返回。
	if (dp[i] > result) result = dp[i];

  程序如下

// 300、最长递增子序列
class Solution {
public:int lengthOfLIS(vector<int>& nums) {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[i], dp[j] + 1);}if (dp[i] > result) result = dp[i];}return result;}
};

复杂度分析:

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

二、674、最长连续递增序列

在这里插入图片描述

  思路分析:本题和300、LeetCode最长递增子序列类似,区别在于最长子序列从非连续到连续。因为要求连续的递增子序列,那么我们只需要考察连续这个性质,而连续递增只需要对比nums数组中相邻的两个数。

  • 第一步,动态数组的含义。 d p [ i ] dp[i] dp[i]代表 i i i之前包括以 i i i结尾的最长递增子序列的长度。我们在做递增比较的时候,两个子序列分别以 n u m s [ i ] nums[i] nums[i] n u m s [ i − 1 ] nums[i-1] nums[i1]作为结尾。
  • 第二步,递推公式。本题只要一个循环,如果 n u m s [ i ] nums[i] nums[i] 大于 n u m s [ i − 1 ] nums[i-1] nums[i1],那么dp[i] = dp[i - 1] + 1。
	if (nums[i] > nums[i-1]) dp[i] = dp[i - 1] + 1;
  • 第三步,元素初始化。dp数组中的所有元素至少为1,因此都初始化为1。
  • 第四步,递归顺序。循环从 i = 1 i=1 i=1开始。
  • 第五步,打印结果。 d p [ n u m s . s i z e ( ) − 1 ] dp[nums.size()-1] dp[nums.size()1]未必是最大的,因此需要筛选出最大的结果返回。
	if (dp[i] > result) result = dp[i];

  程序如下

// 674、最长连续递增序列
class Solution2 {
public:int findLengthOfLCIS(vector<int>& nums) {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;if (dp[i] > result) result = dp[i];}return result;}
};

复杂度分析:

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

三、完整代码

# include <iostream>
# include <vector>
using namespace std;// 300、最长递增子序列
class Solution {
public:int lengthOfLIS(vector<int>& nums) {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[i], dp[j] + 1);}if (dp[i] > result) result = dp[i];}return result;}
};// 674、最长连续递增序列
class Solution2 {
public:int findLengthOfLCIS(vector<int>& nums) {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;if (dp[i] > result) result = dp[i];}return result;}
};int main() {vector<int> nums = { 1,3,5,4,7 };Solution2 s1;int result = s1.findLengthOfLCIS(nums);cout << result << endl;system("pause");return 0;
}

end

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录element-plus树型表格的bug

问题描述 如果数据的子节点命名时children,就没有任何问题&#xff0c;如果后端数据结构子节点是其他名字&#xff0c;比如thisChildList就有bug const tableData [{id: 1,date: 2016-05-02,name: wangxiaohu,address: No. 189, Grove St, Los Angeles,selectedAble: true,th…

应用层协议 ——— HTTP协议

应用层协议 ——— HTTP协议 HTTP简介认识URL二、登录信息三、服务器地址四、服务器端口号五、带层次的文件路径六、查询字符串七、片段标识符urlencode和urldecodeHTTP协议格式HTTP请求协议格式HTTP的方法HTTP的状态码HTTP常见的HeaderHTTPS VS HTTP对称加密 VS 非对称加密 HT…

python自动化测试框架unittest与pytest的区别

有使用过unittest单元测试框架&#xff0c;再使用pytest单元测试框架&#xff0c;就可以明显感觉到pytest比unittest真的简洁、方便很多。 unittest与pytest的区别&#xff1a; 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比…

闲聊电脑(4)硬盘分区

夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次你说的那个“分区”和“格式化”是什么意思&#xff1f; 冰箱&#xff1a;分区么&#xff0c;就是分…

总结Java中的双列集合

目录 双列集合 双列集合的特点 集合体系结构 Map的常见API Map的遍历方式 键找值 键值对 Lambda表达式 底层源码&#xff1a; HashMap HashMap的特点 案例 LinkedHashMap TreeMap TreeMap基本应用 需求1: 需求2: 案例 可变参数 Collections Collections常用…

day03.函数与指针(含new与delete关键字)

一.指针 #include<iostream> using namespace std; #define pi 3.14159//定义常量int main(){cout<<pi<<endl;int a10;int *pNULL;//定义指针p&a;cout<<"a的地址为&#xff1a;"<<p<<endl;cout<<"a"<&l…

大学与社会的区别是什么?

大家好&#xff0c;我是秋意零。 在回答这个问题前&#xff0c;你可能也会有两个疑问。 ● 为什么在社会中不能像在学校一样自律&#xff1f; ● 如何调整适应社会这个新环境呢&#xff1f; 一、为什么在社会中不能像在学校一样自律&#xff1f; 为什么在社会中不能像在学…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

10 排序的概念

目录 1.排序的概念和运用 2.排序的分类 1. 排序的概念及运用 1.1 排序的概念 排序: 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

python3基础学习一

打印print()函数 R 主要的原因是为防止转义&#xff0c;保证r后面的内容全文输出f “主要作用就是格式化字符串&#xff0c;加上f以后&#xff0c;{“变量/表达式”},花括号里的变量和表达式就可以使用了” def ptSubstr():msg "hello,world!"print(msg[0:-1]);prin…

线性代数:矩阵的秩

目录 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论

水闸安全监测系统的主要监测项和优势

一、行业背景 水闸工程作为防洪保安、调控水资源的重要设施,其安全运行至关重要。为规范水闸安全监测、掌握水闸运行性态、评价施工质量、反馈设计指标、降低失事风险等&#xff0c;有必要在水闸主要结构病害特征分析的基础上&#xff0c;确定了水闸监测项目主要包括闸墩及翼墙…