滑动窗口解决长度最小子数组和绝对值不超过限制的最长子数组

news/2024/11/29 1:35:31/

滑动窗口

滑动窗口思路就是维护一个窗口,不断滑动窗口、更新答案。
大致框架(具体情况要具体分析)如下:

int left = 0,right = 0;
while(right<s.size()){//增大窗口window.add(s[right]);right++;...while(缩小窗口的条件){//缩小窗口window.remove(s[left]);left++;}
}

使用滑动窗口解决问题,需要考虑一下几点

  • 什么时候增大right扩大窗口?扩大窗口需要更新哪些数据?
  • 什么时候需要增大left缩小窗口?缩小窗口需要更新哪些数据?
  • 我们需要的结果应该在增大窗口还是缩小窗口时更新?

最小子数组

力扣209

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

测试样例

示例 1:输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:输入:target = 4, nums = [1,4,4]
输出:1
示例 3:输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

代码

int minSunArrayLen(int target, vector<int>& nums){int left = 0,right = 0;int num = target;int res = INT_MAX;while(right<nums,size()){num -= nums[right];while(num <= 0){res = min(res,right-left+1);num +=nums[left];//缩小窗口left++;}//增大窗口right++;}return res == INT_MAX ? 0 : res;
}

绝对值不超过限制的最长子数组

力扣1438

题目

给你一个整数数组 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

思路

要使得任意两个元素之间的绝对值差小于等于limit,只需要最大值和最小值的差小于或等于limit即可。所以问题的难点在于如何找到窗口中的最大和最小值。

思路1:可以使用自平衡的红黑数mulitset
思路2:可以使用两个单调队列记录窗口中的最大和最小值。

代码

思路1:

int longestSubarray(vector<int>& nums, int limit) {int left = 0,right = 0;int res = INT_MIN;multiset<int>s;while(right<nums.szie()){s.insert(nums[right]);while(*s.rbegin() - *s.begin() > limit){			s.erase(s.find(nums[left]));left++;}res = max(res,right - left + 1);right++;}return res == INT_MIN ? 0 : res;
}

思路2:

int longestSubarray(vector<int>& nums, int limit) {int left = 0,right = 0;int res = INT_MIN;//单调递减队列维护最大值deque<int>downMax;//单调递增队列维护最小值deque<int>upMin;while(right<nums.size()){while(!downMax.empty()&&nums[right] > downMax.back()){downMax.pop_back();}while(!upMin.empty()&&nums[right] < upMin.back()){upMin.pop_back();}downMax.push_back(nums[right]);upMin.push_back(nums[right]);//缩小窗口while(!downMax.empty()&&!upMin.empty()&&downMax.front()-upMin.front() > limit){if(nums[left] == downMax.front()){downMax.pop_front();}if(nums[left] == upMin.front()){upMin.pop_front();}left++;}res = max(res,right-left+1);right++;}return res == INT_MIN ? 0 : res;
}

http://www.ppmy.cn/news/957402.html

相关文章

P5708 【深基2.习2】三角形面积

题目描述 一个三角形的三边长分别是 &#xfffd;a、&#xfffd;b、&#xfffd;c&#xff0c;那么它的面积为 &#xfffd;(&#xfffd;−&#xfffd;)(&#xfffd;−&#xfffd;)(&#xfffd;−&#xfffd;)p(p−a)(p−b)(p−c)​&#xff0c;其中 &#xfffd;12(&a…

HYPE分布式水文模型教程

详情点击链接&#xff1a;HYPE分布式水文模型建模方法与案例分析 前言 HYPE(Hydrological Predictions for the Environment, HYPE)是由瑞典皇家水文气象局&#xff08;SMHI&#xff09;在HBV和HBV-NP模型基础上开发的新一代分布式水文模型&#xff0c;已经在全球众多地区得…

ChatGPT为什么懂这么多?

背后的原理是什么&#xff1f;今天我们用最简单的语言让每一个人都搞清楚它为什么这么聪明。全球有8000多家AI公司&#xff0c;ChatGPT甩同类不止一个等级&#xff0c;这源于它复杂的人工神经网络架构。它是科学家受到生物大脑启发&#xff0c;用数学和计算机的算法进行模拟。算…

如何用ChatGPT提高生产效率?

自己不是科班出身&#xff0c;从一开始编程就不是很自信&#xff0c;总觉得跟科班出身的程序员有差距&#xff0c;觉得掌握的知识不系统&#xff0c;这也是客观事实&#xff0c;一直也在补计算机的基础知识。开始的时候&#xff0c;总是想用学校的学习方式&#xff0c;不管学什…

今天我们来浅谈一下ChatGPT到底是什么东西

这是一篇非学术专业性的文章&#xff0c;而我也是为了解chatGPT而学了两三天人工智能&#xff0c;所以哪里写的不好的不对的地方还希望海涵。 图灵测试 1950年&#xff0c;人工智能之父艾伦图灵提出乐“图灵测试”。就是说当你在不面对面的时候跟机器人进行文字聊天的时候&…

《零基础入门学习Python》第044讲:魔法方法:简单定制

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 这节课我们一起来完成一个类的定制&#xff0c; 基本要求&#xff1a; 定制一个计时器的类start和stop方法代表启动计时和停止计时假设计时器对象 t1&#xff0c…

ChatGPT|如何通过ChatGPT问一本书的问题?

很多场景下需要私域数据&#xff0c;但是在使用ChatGPT对话回答是很泛或者没有相关答案&#xff0c;因此你就需要自己喂养数据&#xff0c;然后形成自己的私域数据数据集&#xff0c;以下就是用一本书作为例子&#xff0c;通过输入一本书问ChatGPT关于这本书其中的问题。其步骤…

数学上的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 问题合集一、问题&#xff1a;为什么stats.norm.pdf计算出的概率分布值会大于11.代码2.分析 问题合集 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学…