「数组」定长滑动窗口|不定长滑动窗口 / LeetCode 2461|2958(C++)
目录
概述
1.定长滑动窗口
思路
复杂度
Code
2.不定长滑动窗口
思路
复杂度
Code
总结
概述
在双指针合集中,我们介绍了双指针算法:
「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)
从线性枚举到双指针,我们维护的变量数量从1个提升到2个,那如果我们需要维护一片连续的区域,又该使用什么办法呢?
与双指针算法维护指针指向的两个变量对应的是,滑动窗口也使用双指针,但维护的是两个指针所夹的区间[i,j]。
1.定长滑动窗口
LeetCode 2461:
给你一个整数数组
nums和一个整数k。请你从nums中满足下述条件的全部子数组中找出最大子数组和:
- 子数组的长度是
k,且- 子数组中的所有元素 各不相同 。
返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回
0。子数组 是数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,5,4,2,9,9,9], k = 3 输出:15 解释:nums 中长度为 3 的子数组是: - [1,5,4] 满足全部条件,和为 10 。 - [5,4,2] 满足全部条件,和为 11 。 - [4,2,9] 满足全部条件,和为 15 。 - [2,9,9] 不满足全部条件,因为元素 9 出现重复。 - [9,9,9] 不满足全部条件,因为元素 9 出现重复。 因为 15 是满足全部条件的所有子数组中的最大子数组和,所以返回 15 。
思路
所谓维护两指针之间的长度为k的区域,就是利用额外的数据结构储存这段区域的特征。
定长滑动窗口的流程无非是两步:
①展开窗口并创建初始数据结构
②移动窗口并维护过程数据结构
对于本题,我们使用两个数据结构维护区间特征:哈希表和一个单变量sum。不同的题目自有不同的要求。
第一步:先展开窗口到k的大小,我们创建哈希表储存其中数字出现的次数。
当窗口长度达到k时,我们的初始数据结构哈希表也就创建好了。
unordered_map<int,int>cnt;
const int n=nums.size();
long long ans=0,sum=0;
for(int i=0;i<k;i++){cnt[nums[i]]++;sum+=nums[i];
}
if(cnt.size()==k)ans=sum;
一个值得注意的点是,如果哈希表的键值对数量(也就是哈希表的size)正好是k的话,那么这个初始展开的窗口就是有效的,应该令ans=sum,表示我们考虑此为第一种可能得答案。
第二步:窗口开始滑动,哈希表和sum抛出不需再维护的特征。
*注意*:在一轮循环开始是,j位置是窗口右边界(包含j)移动到的位置,因此每轮循环维护的区域是[j-k+1,j]。
抛出j-k,即左边界外的那个位置,当哈希表维护的对应值为0时,我们使用erase彻底将其在哈希表中抹除,以免无效键值对污染哈希表的size。
for(int j=k;j<n;j++){cnt[nums[j-k]]--,cnt[nums[j]]++;if(!cnt[nums[j-k]])cnt.erase(nums[j-k]);sum=sum-nums[j-k]+nums[j];if(cnt.size()==k)ans=max(ans,sum);
}
return ans;
时时更新ans,维护其最大性质。
复杂度
时间复杂度:O(n)
Code
class Solution {
public:long long maximumSubarraySum(vector<int>& nums, int k) {unordered_map<int,int>cnt;const int n=nums.size();long long ans=0,sum=0;for(int i=0;i<k;i++){cnt[nums[i]]++;sum+=nums[i];}if(cnt.size()==k)ans=sum;for(int j=k;j<n;j++){cnt[nums[j-k]]--,cnt[nums[j]]++;if(!cnt[nums[j-k]])cnt.erase(nums[j-k]);sum=sum-nums[j-k]+nums[j];if(cnt.size()==k)ans=max(ans,sum);}return ans;}
};
2.不定长滑动窗口
LeetCode 2958:
给你一个整数数组
nums和一个整数k。一个元素
x在数组中的 频率 指的是它在数组中的出现次数。如果一个数组中所有元素的频率都 小于等于
k,那么我们称这个数组是 好 数组。请你返回
nums中 最长好 子数组的长度。子数组 指的是一个数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,2,3,1,2,3,1,2], k = 2 输出:6 解释:最长好子数组是 [1,2,3,1,2,3] ,值 1 ,2 和 3 在子数组中的频率都没有超过 k = 2 。[2,3,1,2,3,1] 和 [3,1,2,3,1,2] 也是好子数组。 最长好子数组的长度为 6 。
思路
不定长窗口和定长窗口的滑动本质上并无不同,尽管它看起来更难。
仍然,我们使用数据结构维护区间特征,只不过这次,左边界移动的条件是通过访问数据结构来达到的。
具体的,我们会使用外层for循环控制右边界j的移动,而左边界的移动i则有内层while循环来实现。while循环的条件取决于维护[i,j]特征的数据结构,当特征不满足题意时,i左移抛出最左侧特征,并更新数据结构,一直循环到满足题意为止,则我们得到了[i,j]有效窗口区。
不定长滑动窗口的流程可以直接套模板,用伪代码展现的话,应该是这样的:
{
某数据结构 data;
int ans=0;
for(j遍历nums){
data加入nums[j]特征;
while(i<j&&data不满足题设条件)数据结构抛出nums[i],i++;
if(data满足题设条件)更新ans;
}
}
对于本题,数据结构data应为一张记录了元素出现次数的哈希表。
同时,所谓“data不满足题设条件”只需要研究nums[j]即可,因为对于j之前的元素,上一次外层for循环会保证其满足题设条件。
*注意*:更新ans时要确保当前满足题设条件,因为i==j也会退出while循环。
复杂度
时间复杂度:O(n)
复杂度分析:
时间分析: {
指针j共遍历数组一次,复杂度为O(n)。
指针i虽在内层循环,但只前进不倒退,复杂度为O(n)。
故整体复杂度为O(n)。
}
Code
class Solution {
public:int maxSubarrayLength(vector<int>& nums, int k) {unordered_map<int,int>hash;const int n=nums.size();int ans=0;for(int i=0,j=0;j<n;j++){hash[nums[j]]++;while(i<j&&hash[nums[j]]>k)hash[nums[i++]]--;if(hash[nums[j]]<=k)ans=max(ans,j-i+1);}return ans;}
};
总结
滑动窗口是一类经典的双指针问题,它会借用额外的存储结构来维护一段连续的子数组。
但需要注意的是,一旦出现负数,它会变得极其被动,这是由于我们期望滑动窗口维护的区间特征总是右增左减的。
相关文章:
「数组」定长滑动窗口|不定长滑动窗口 / LeetCode 2461|2958(C++)
目录 概述 1.定长滑动窗口 思路 复杂度 Code 2.不定长滑动窗口 思路 复杂度 Code 总结 概述 在双指针合集中,我们介绍了双指针算法: 「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11&#…...
【华为】用策略路由解决双出口运营商问题
需求描述 不同网段访问互联网资源时,走不同的出口,即PC1走电信出口,PC2走移动出口。 客户在内网接口下应用策略路由后往往出现无法访问内网管理地址的现象,该举例给出解决办法。 拓扑图 基础配置 #sysname R1 # # interface G…...
第L2周:机器学习|线性回归模型 LinearRegression:1. 简单线性回归模型
本文为🔗365天深度学习训练营 中的学习记录博客原作者:K同学啊 任务: ●1. 通过本文学习LinearRegression简单线形回归模型。 ●2. 模仿本文代码,通过鸢尾花花瓣长度预测花瓣宽度。 一、概念 什么是回归 回归的目的是为了预测&…...
1.5 测试用例
欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 测试用例介绍2 测试用例编写3 案例分析 前言 测试用例的设计和编制是软件活动中最重要的工作。本文详细讲解了测试用例的基本概念以及如何编写测试用例。 本篇文章参考黑马程序…...
P1101 单词方阵
1. 题目链接P1101 单词方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; #define endl \n #define int long long int int xx[] {1,1,1,0,0,-1,-1,-1}; int yy[] {1,0,-1,1,-1,1,0,-1}; int vis[110][110]; char a[11…...
通过 OBD Demo 体验 OceanBase 4.3 社区版
本文作者:马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构,引入了列存引擎,实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能,同时也确保了TP业务场景…...
浅拷贝和深拷贝(Java 与 JavaScript)
一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…...
力扣每日一题 2306.公司命名
做题过程中使用到的java语法: 1.从一个字符串中取出一部分字符串: String str "Hello, World!"; String part str.substring(7); // 从索引7开始到字符串末尾 System.out.println(part); // 输出: World! class Solution { public lo…...
HTML-DOM模型
1.DOM模型 window对象下的document对象就是DOM模型。 DOM描绘了一个层次化的节点树,每一个节点就是一个html标签,而且每一个节点也是一个DOM对象。 2.操作DOM 2.1.获取DOM对象常用方法 获取DOM对象的常用方法有如下几种: getElementById(…...
vue项目报错: At least one is required in a single file component.的主要原因及解决办法
本篇文章主要讲解 vue项目报错: At least one is required in a single file component.的主要原因及解决办法 作者:任聪聪 日期:2024年9月25日 报文信息: Compiled with problems: ERROR in ./src/xxxx.vue Module Error (from …...
03DSP学习-利用syscfg配置IO
上一篇博客介绍了syscfg,对syscfg有了初步的了解,但是在真正使用上它之前,还不能理解他是一个神器。 (在写博客的时候,我是在从头到尾重新完成这个步骤,希望对初学者有点帮助) 找到Board Component 打开syscfg文件&…...
web - RequestResponse
##Request&Response 1,Request和Response的概述 Request是请求对象,Response是响应对象。这两个对象在我们使用Servlet的时候有看到: 此时,我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…...
个人文章汇总
文章模块文章汇总心得&资料 真正优秀的人,更懂得尊重别人 如何用沟通解决80%的工作问题 一个IT青年北漂四年的感悟 史上最污技术解读 操作系统相关 操作系统基础 操作系统:从工厂的角度来理解进程线程操作系统:详述对进程和线程的认识操作…...
Java | Leetcode Java题解之第436题寻找右区间
题目: 题解: class Solution {public int[] findRightInterval(int[][] intervals) {int n intervals.length;int[][] startIntervals new int[n][2];int[][] endIntervals new int[n][2];for (int i 0; i < n; i) {startIntervals[i][0] inter…...
大模型智能体在金融公告理解领域的应用 | OPENAIGC开发者大赛高校组AI创新之星奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
链表入门(LeetCode题目)
来源:左程云算法 链表的题目我们经常是有思路但是实现起来总有些小问题,所以是准备笔试应多加练习的一类题 206. 反转链表 这道题我们可以新开链表来存,但是如果面试中有这道题,面试官让你优化又该如何呢?所以我们采…...
kibana开启访问登录认证
编辑es配置文件,添加以下内容开启es认证 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization xpack.security.enabled: true xpack.security.transport.ssl.enable…...
Java 14Java 15新特性概述
一、Java 14 发布于2020年3月17日。Java 14主要新特性如下: JEP 305:Pattern Matching for instanceof (Preview)instanceof 的模式匹配(预览) JEP 358:Helpful NullPointerExceptions 有用的 NullPointerExceptions…...
流量特征随机ua修改
作为一个蓝队吗喽,总是能看见因为ua头特征而直接被拦截的ip,当然了还有些是通过X-Forwarded-For被拦截的(X-Forwarded-For:fofa.info,不拦你才怪), 主要是通过python的mitmproxy和fake_useragent两个模块进行实现,代码量极低 fr…...
CSP-S 2024 提高级 第一轮(初赛) 阅读程序(3)
【题目】 CSP-S 2024 提高级 第一轮(初赛) 阅读程序(3) 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn 1000000 5; 7 const int P1 998…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
