【C++单调队列】1438. 绝对差不超过限制的最长连续子数组|1672

本文时间知识点

C++队列、双向队列

LeetCode1438. 绝对差不超过限制的最长连续子数组

给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
示例 1:
输入:nums = [8,2,4,7], limit = 4
输出:2
解释:所有子数组如下:
[8] 最大绝对差 |8-8| = 0 <= 4.
[8,2] 最大绝对差 |8-2| = 6 > 4.
[8,2,4] 最大绝对差 |8-2| = 6 > 4.
[8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
[2] 最大绝对差 |2-2| = 0 <= 4.
[2,4] 最大绝对差 |2-4| = 2 <= 4.
[2,4,7] 最大绝对差 |2-7| = 5 > 4.
[4] 最大绝对差 |4-4| = 0 <= 4.
[4,7] 最大绝对差 |4-7| = 3 <= 4.
[7] 最大绝对差 |7-7| = 0 <= 4.
因此,满足题意的最长子数组的长度为 2 。
示例 2:
输入:nums = [10,1,2,4,7,2], limit = 5
输出:4
解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。
示例 3:
输入:nums = [4,2,2,2,4,4,2,2], limit = 0
输出:3
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
0 <= limit <= 109

滑动窗口(错误解法)

i从小到大枚举nums[i],令nums[i1…i]是符合条件的子数组。
由于abs(i1-1,nums[i])>limit,故nums[i1-1…i1+1]一定不符合条件,故从i1可以判断。
如果nums[i1]和nums[i+1]符合条件,则i1++。
错误原因:nums[i1+2]可以和nums[i]不符合

滑动窗口+有序映射(集合)

记录nums[i1…i]的值和下标。如果set最小的值和nums[i]超过限制,则将下标小于等于最小值下标的删除。set最大值超限,也是如此。处理完超限后,将nums[i]放到set。此时的set.size就是以 nusm[i]结尾的最长子数组长度。
时间复杂度:O(nlogn)

滑动窗口+单调队列

两个双向队列分别记录(nums[i],i) ,其中i ∈ \in [0,j-1]。
minQue如果有元素x,其下标为i1 ,符合小于x <nums[i]- limit,则删除下标小于等于i1的元素。
i1 <i2,且nums[i1]>= nums[i2] 。如果i1符合条件,则i2也一定符合。而i2符合会删除i1。故i1可以省略,或者说i1被i2淘汰后。
淘汰后,从队首到队尾,严格升序,即最小元素在队首。
maxQue类似,严格降序。
队首可能有多个元素超限,一个队列超限后,要清理另一个队列的下标。
时间复杂度:O(n)

代码

核心代码

class Solution {public:int longestSubarray(vector<int>& nums, int limit) {deque<int> minQue, maxQue;int ans = 0;int del = -1;for (int i = 0; i < nums.size(); i++) {					while (minQue.size() && (nums[minQue.front()] < nums[i] - limit )) {del = max(del, minQue.front());minQue.pop_front();}while (maxQue.size() && (nums[maxQue.front()] > nums[i] + limit)) {del = max(del, maxQue.front());maxQue.pop_front();}while (minQue.size() && (minQue.front() <= del)) { minQue.pop_front(); }while (maxQue.size() && (maxQue.front() <= del)) { maxQue.pop_front(); }					while (minQue.size() && (nums[minQue.back()] >= nums[i])) {minQue.pop_back();}while (maxQue.size() && (nums[maxQue.back()] <= nums[i])) {maxQue.pop_back();}minQue.emplace_back(i);maxQue.emplace_back(i);ans = max(ans, i - del);}return ans;}};

单元测试

	vector<int> nums;int limit;TEST_METHOD(TestMethod1){nums = {1,5 }, limit = 3;auto res = Solution().longestSubarray(nums, limit);AssertEx(1, res);}TEST_METHOD(TestMethod2){nums = { 1,5 }, limit = 5;auto res = Solution().longestSubarray(nums, limit);AssertEx(2, res);}TEST_METHOD(TestMethod11){nums = { 8, 2, 4, 7 }, limit = 4;auto res = Solution().longestSubarray(nums, limit);AssertEx(2, res);}TEST_METHOD(TestMethod12){nums = { 10,1,2,4,7,2 }, limit = 5;auto res = Solution().longestSubarray(nums, limit);AssertEx(4, res);}TEST_METHOD(TestMethod13){nums = { 4,2,2,2,4,4,2,2 }, limit = 0;auto res = Solution().longestSubarray(nums, limit);AssertEx(3, res);}TEST_METHOD(TestMethod14){nums = { 2,2,2,4,4,2,5,5,5,5,5,2 }, limit = 2;auto res = Solution().longestSubarray(nums, limit);AssertEx(6, res);}TEST_METHOD(TestMethod15){nums = { 24,12,71,33,5,87,10,11,3,58,2,97,97,36,32,35,15,80,24,45,38,9,22,21,33,68,22,85,35,83,92,38,59,90,42,64,61,15,4,40,50,44,54,25,34,14,33,94,66,27,78,56,3,29,3,51,19,5,93,21,58,91,65,87,55,70,29,81,89,67,58,29,68,84,4,51,87,74,42,85,81,55,8,95,39 }, limit = 87;auto res = Solution().longestSubarray(nums, limit);AssertEx(25, res);}TEST_METHOD(TestMethod16){nums = { 7,40,10,10,40,39,96,21,54,73,33,17,2,72,5,76,28,73,59,22,100,91,80,66,5,49,26,45,13,27,74,87,56,76,25,64,14,86,50,38,65,64,3,42,79,52,37,3,21,26,42,73,18,44,55,28,35,87 }, limit = 63;auto res = Solution().longestSubarray(nums, limit);AssertEx(9, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Flume实战--Flume中的选择器、自动容灾(故障转移)、负载均衡的详解与操作

本文详细介绍了Apache Flume的关键特性&#xff0c;包括选择器、拦截器、故障转移和负载均衡。选择器负责将数据分发到多个Channel&#xff0c;拦截器用于修改或丢弃Event。故障转移机制能够在Sink故障时自动切换&#xff0c;而负载均衡则在多个Sink间分配负载。文章还提供了自…

CANoe_DBC能够打开但是无法使用“BusType”

解决DBC文件在CAPL中调用问题&#xff1a;从CANdb到CAPL的顺畅过渡 在汽车电子和嵌入式系统开发中&#xff0c;DBC&#xff08;Database CAN&#xff09;文件作为描述CAN&#xff08;Controller Area Network&#xff09;通信协议的重要工具&#xff0c;广泛应用于网络设计、测…

工作日志:ruoyi-vue-plus echarts根据窗口大小变化

1、echarts根据窗口大小变化。 onMounted(() > {// 折线图type EChartsOption echarts.EChartsOption;var chartDom document.getElementById(chartDom)!;var myChart echarts.init(chartDom);var option: EChartsOption;option {grid: {left: 35,top: 10,bottom: 30,r…

jenkins部署Maven和NodeJS项目

在 Java 项目开发中&#xff0c;项目的编译、测试、打包等是比较繁琐的&#xff0c;属于重复劳动的工作&#xff0c;浪费人力和时间成本。以往开发项目时&#xff0c;程序员往往需要花较多的精力在引用 jar 包搭建项目环境上&#xff0c;跨部门甚至跨人员之间的项目结构都有可能…

1.8 软件业务测试

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 概述2 方法3 测试策略4 案例分析 前言 在软件开发生命周期中&#xff0c;业务测试扮演着至关重要的角色。本文详细讲解了业务测试的定义、目的、方法以及测试策略。 本篇文章参…

C++队列、双向队列

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 队列 队列&#xff08;Queue&#xff09;是一种基本的线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out, FIFO&#xff09;的原则。这意味着最先被添加到队列中的元素将会是最先被移除的。和生活…

命令回显echo

命令回显 通常&#xff0c;make在执行命令行之前会把要执行的命令行进行输出。我们称之为“回显”&#xff0c;就好像我们输入命令执行一样。 如果要执行的命令行以字符“”开始&#xff0c;则make在执行时这个命令就不会被回显。典型的用法是我们在使用“echo”命令输出一些信…

Github 2024-09-29 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Java项目1ASP项目1Coolify: 开源自助云平台 创建周期:1112 天开发语言:PHP, Blade协议类型:Apache License 2.0Star数量…

Java多线程几个哈希表的区别

HashMap 首先HashMap肯定是不行的,并没有加解锁操作,一旦多线程同时写的话,直接就会发生覆盖之类的操作 排除HashMap先,主要对比HashTable和ConcurrentHashMap HashTable vs ConcurrentHashMap 1. 加锁粒度不同 HashTable HashTable是对整个哈希表进行加锁操作,任何增删改查操…

数据结构串的kmp相关(求next和nextval)

傻瓜版&#xff0c;用来演示手算过程&#xff0c;个人理解用的&#xff0c;仅供参考。

CICD Jenkins实现Pipline

一、安装 1、由于 Jenkins 是基于 Java 的&#xff0c;首先需要确保你的系统中安装了 Java。推荐使用 OpenJDK 11。可以通过以下命令安装&#xff1a; apt update apt install openjdk-11-jdk2、在安装 Jenkins 之前&#xff0c;你需要将其仓库添加到你的系统中。首先&#x…

DotNetty ChannelRead接收数据为null

问题&#xff1a;C#使用Dotnetty和Java netty服务器通讯&#xff0c;结果能正确发送数据到服务器&#xff0c;却始终接收不到服务器返回的数据。 解决&#xff1a;一定一定要注意服务器和客户端使用的编码一定要完全一样才行 我先前在客户端添加了StringDecoder,服务器却没有…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域&#xff0c;Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸&#xff0c;为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程&#xff0c;让开发者能够专注于业务逻辑的实现。无论是构建小型的…

8.12 矢量图层面要素单一符号使用八(随机标记填充)

8.12 矢量图层面要素单一符号使用八(随机标记填充)_qgis随机填充-CSDN博客 目录 前言 随机标记填充&#xff08;Random Marker Fill&#xff09; QGis设置面符号为随机标记填充&#xff08;Random Marker Fill&#xff09; 二次开发代码实现随机标记填充&#xff08;Rando…

《低空经济:文旅行业的新引擎 》

《低空经济&#xff1a;文旅行业的新引擎 》 一、低空经济与文旅行业的融合态势 低空经济作为新兴经济形态&#xff0c;正与文旅行业深度融合&#xff0c;为文旅发展带来新机遇。 近年来&#xff0c;随着科技的不断进步和人们对旅游体验的不断追求&#xff0c;低空经济与文旅…

Java面试常见问题总结

Java基础 Java 中的⼏种基本数据类型是什么&#xff1f;对应的包装类型是什么&#xff1f;各⾃占⽤多少字节呢&#xff1f; Java 中有 8 种基本数据类型&#xff0c;分别为&#xff1a; 6 种数字类型&#xff1a; 4 种整数型&#xff1a;byte、short、int、long2 种浮点型&a…

elasticsearch基础知识、go如何操作elasticsearch

【单元目标】 什么是elasticsearch&#xff1f; elasticsearch Analysis(分词器)概念及使用 go实现elasticsearch 搜索封装 【教学内容】 1. 什么是elasticsearch&#xff1f; Elasticsearch 是一个实时的分布式存储、搜索、分析的引擎。 Elasticsearch is a real-time, …

在Windows上使用谷歌浏览器的安全支付功能

在使用谷歌浏览器进行在线支付时&#xff0c;确保您的交易安全至关重要。本文将为您提供详细的步骤&#xff0c;帮助您在Windows系统上启用和使用谷歌浏览器的安全支付功能。 &#xff08;本文由https://www.chromexz.com.cn/站点的作者进行编写&#xff0c;转载时请进行标注。…

Unity 代码裁剪(Strip Engine Code)

文章目录 0.IL2CPP 打包运行闪退问题1.什么是代码裁剪2.为什么要使用代码裁剪3.代码裁剪设置与级别4.强制保留代码4.1 使用[Preserve]标签4.2 使用Link.xml文件 5.Strip中遇到的问题及解决方法6.注意事项 0.IL2CPP 打包运行闪退问题 Google Play要求从2019年8月1日起apk必须支…

《后端程序猿 · Spring事务失效场景》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…