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

leetCode 674. 最长连续递增序列 动态规划 / 贪心策略

674. 最长连续递增序列 - 力扣(LeetCode)

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 rl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

 >>思路和分析

本题相对于leetCode 300.最长递增子序列 最大区别在于 “连续”

  • 不连续递增子序列的跟前0-i 个状态有关(两个for循环)
  • 连续递增的子序列只跟前一个状态有关(一个for循环)

>>方法一:动态规划

1.确定dp数组(dp table)以及下标的含义

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

注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。

2.确定递推公式

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

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

3.dp数组初始化

下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。所以dp[i]应该初始1;

4.确定遍历顺序

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

for (int i = 1; i < nums.size(); i++) {if (nums[i] > nums[i - 1]) { // 连续记录dp[i] = dp[i - 1] + 1;}
}

5.举例推导dp数组

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)

>>方法二:贪心策略

当遇到nums[i] > nums[i - 1]的情况,count++,否则count 为 1,记录下count的最大值即可

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() == 0) return 0;int count=1;int result=1;// 连续子序列最少也是1for(int i=1;i<nums.size();i++) {// 连续记录if(nums[i]>nums[i-1]) count = count + 1;// 不连续,count从头开始else count=1;result = max(count,result);}return result;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

>>来自代码随想录课堂截图:

>>参考和推荐文章、视频

代码随想录 (programmercarl.com)

动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列_哔哩哔哩_bilibili

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

相关文章:

  • 数据中台实战(11)-数据中台的数据安全解决方案
  • 林沛满-TCP之在途字节数
  • HTTPS 加密工作过程
  • 校招秋招,性格和职业有关系吗?
  • 网络和系统操作命令
  • 刷穿力扣(1~30)
  • 栈和队列的基本操作
  • 变压器绕组断股往往导致直流电阻不平衡率超标
  • stack和queque
  • 信息学 学习/复习 抽签器(附源码)
  • 基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略(Simulink仿真实现)
  • [0xGame 2023] week1
  • Matlab矩阵——矩阵行列互换
  • OpenMesh 网格面片随机赋色
  • SpringSecurity源码学习一:过滤器执行原理
  • 8.2 JUC - 4.Semaphore
  • 前端try和catch
  • Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出
  • 目标检测算法改进系列之Backbone替换为Swin Transformer
  • 【技术干货】如何通过 DP 实现支持经典蓝牙的联网单品设备与 App 配对
  • 【Unity Build-In管线的SurfaceShader剖析_PBS光照函数】
  • thinkphp5实现ajax图片上传,压缩保存到服务器
  • 王道考研计算机网络——传输层
  • 08 集群参数配置(下)
  • mac文件为什么不能拖进U盘?
  • RK3568的CAN驱动适配
  • Opengl之立方体贴图
  • EF Core报错:Error Number:-2146893019
  • QT之可自由折叠和展开的布局
  • javascript二维数组(7)数组指定元素求和