Flink窗口分为滚动(tumbling)、滑动(sliding)和会话(session)窗口三大类,本文要说的是滑动窗口。 下图示出一个典型的统计用户访问的滑动窗口。 ?....keyBy("userId") .window(SlidingEventTimeWindows.of(Time.minutes(2), Time.minutes(1))); 由图可知,当前滑动窗口与上一个滑动窗口会有重叠...直觉上我们需要用粒度为1440 / 3 = 480的滑动窗口来实现它,但是细粒度的滑动窗口会带来性能问题,有两点: 状态 由代码可知,WindowOperator内维护了窗口本身的内部状态windowState...而在WindowOperator中,每一个(key, window)二元组都需要注册两个定时器:一是触发器注册的定时器,用于决定窗口数据何时输出;二是registerCleanupTimer()方法注册的清理定时器...可能有看官会问:预聚合不能解决细粒度窗口的问题吗?答案是不能。
前言 如果说如何用算法高效有趣的解决某些问题,那多指针和滑动算法绝对是算其中的佼佼者。...这也是笔者最初接触算法时觉得最有意思的一点,因为解决的问题是熟悉的,但配方却完全不同,本章我们从一个简单的交集问题出发,一步步的认识到多指针及滑动窗口解决某些问题时的巧妙与高效,本章主要以解LeetCode...双指针: 当然,还可以使用一种双指针的解法,首先还是对两个数组进行排序,然后使用两个指针分别指着两个数组的开头,谁的数值小谁向后滑动,遇到相同的元素就放入set内,直至两个数组中有一个到头为止。...而这道经典题目,我们同样可以使用对撞指针解法,首先设置首尾两个指针,依次向中间靠近,但这题麻烦的地方在于两个指针之间谁动谁不动的问题。 经过观察不难发现,就是指针所指向的值,谁的数值小,谁就需要移动。...当找到一个连续子数组后,让左侧的窗口向右滑动,减去最左侧的值,减小窗口内的和,也让窗口右侧滑动。如果又找到了一个满足条件的子数组,与之前的子数组长度进行比较,更新最小窗口的大小即可。
求可能分散开的数字组合,变为求一定连续的中间的数字组合为数组总和-目标数; 2.求最小的组合数字之和,变为求中间区间满足条件的长度; 3.最后返回时,进行“取反”即可 具体的图示如下: 解释: 此时就变成了典型滑动窗口的问题了...”当这里的right向后移动后,不断进行相加的操作,将数字进入窗口 第三步:“判断条件”这里就是判断此时和是否大于目标数 第四步:“出窗口”这里基于判断条件进行操作,大于了此时right向后移动就没有意义了...,就是使用双指针来判断这个区间里的数字的种类多少,以及更新区间的长度,如果出现了超过两种类型的数字,那么left+1,然后这里的right就进行=left的操作重新开始; 2.滑动窗口 滑动窗口的具体思路和暴力枚举差不多...,但是滑动窗口是对暴力枚举的一种优化,我们判断right是否需要进行前移的操作 思路: 在满足条件时,我们需要保持right进行后移,left与right组成区间里的数字的种类是否大于2,如果大于2,...3.总结 本期主要讲解了关于力扣上面的两道题目:1.将x减小到零的最小操作数 ,水果成篮;两篇的核心就是改变思维方式,从反面进行入手,以及如何读懂题目描述,利用滑动窗口进行解决; ~~~~最后希望与诸君共勉
2.在 process1 函数中,首先判断删除次数 k 是否小于 0。如果是,则返回 0。 3.然后判断当前下标 i 是否等于 arr 的长度。...如果是,则说明已经遍历到了数组末尾,需要统计当前子序列中最长的连续相同元素的长度,并返回该长度。...算法2:滑动窗口算法 1.使用 HashMap 来记录每个数最后出现的位置,初始化答案 ans 为 1。...滑动窗口算法时间复杂度为 O(n),空间复杂度为 O(n)。其中,滑动窗口算法在处理大规模数据时更加高效。
2.在 process1 函数中,首先判断删除次数 k 是否小于 0。如果是,则返回 0。 3.然后判断当前下标 i 是否等于 arr 的长度。...如果是,则说明已经遍历到了数组末尾,需要统计当前子序列中最长的连续相同元素的长度,并返回该长度。...# 算法2:滑动窗口算法 1.使用 HashMap 来记录每个数最后出现的位置,初始化答案 ans 为 1。...滑动窗口算法时间复杂度为 O(n),空间复杂度为 O(n)。其中,滑动窗口算法在处理大规模数据时更加高效。
操作滑动窗口通常涉及以下几个步骤: 初始化两个指针,通常称为 left 和 right,指向序列的起始部分,这定义了窗口的边界。...在移动 left 指针的同时,我们可以更新相关的计算结果,如累积和或计数器等 在整个过程中,我们通常会记录窗口相关的一些信息,如窗口大小、窗口内元素的总和、窗口中的最大或最小元素等,可能还会记录与问题计算要求相关的最优结果...持续这个过程,有序地移动 left 和 right 指针,直到滑动窗口穷尽了整个序列的所有可能的连续元素集 一个常见的滑动窗口问题示例是找出一个数组中和至少为 target 的最短连续子数组...这个问题可以用滑动窗口算法解决: hash 数组用来计数每种水果当前在窗口中的数量。 两个变量 left 和 right 表示当前窗口(子数组)的两端位置。...p 的长度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量; 当窗口中每种字母的数量与字符串 p 中每种字⺟的数量相同时,则说明当前窗口为字符串 p 的异位词; 因此可以用两个大小为 26 的数组来模拟哈希表
由于异位词由相同字母组成且长度与 p 相同,因此我们可以使用滑动窗口来解决这一问题。...窗口大小固定: 因为异位词的长度一定与字符串 p 的长度相同,所以我们构造一个长度为 p.size() 的滑动窗口,每次右移窗口,动态维护窗口内每个字母的出现频次。...因为直接比较两个哈希表时间复杂度很高,这里我们想到了一种优化方式,要判断窗口字符串是否是异位词,我们只需要判断同一种字符在两个字符串中出现的次数是否一样即可,这里我们使用count来统计有效字符的个数即可轻松判断窗口字符串是否是...写在最后 在这篇博客中,我们继续探索了滑动窗口的高级应用,通过对一系列复杂问题的深度剖析,进一步展示了滑动窗口的灵活性与高效性。...无论是「水果成篮」的双种类约束,还是「找到字符串中所有字母异位词」的字符频次比较,抑或是「串联所有单词的子串」的字符串匹配与「最小覆盖子串」的字符覆盖问题,这些问题都通过滑动窗口的精妙操作得到了优雅的解决
,前缀和等等),再利用双指针遍历;这两种方法都可以将双循环问题转化为单循环问题,从而有效地降低算法的时间复杂度。...下面,结合实际的题目来理解如何使用滑动窗口算法。二、567. 字符串的排列给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。...本道题目实际上可以转化为是否能找出满足以下条件的 s2 字符串的子串:该子串的长度和 s1 字符串的长度相等;该子串中包含的字符以及对应的数量和 s1 字符串相同;那么结合滑动窗口算法,需要维护一个长度为...s1 字符串长度的窗口,并且窗口中的字符以及相应的数量与 s1 相同。...本题利用滑动窗口算法的难点在于如何确定当前窗口中的有效“山脉”形态:窗口移动的过程中,需要采用两个变量来记录当前窗口中包含的序列的单调性;窗口移动过程中遇到递增序列时,如果此时窗口中已经包含递减序列,那么需要向前移动左指针
滑动窗口的概念: 使用两个指针left和right来表示当前窗口的范围。right指针扩展窗口,left指针在窗口大小超过p的长度时收缩窗口。...} }; 这段代码用于解决“在字符串s中查找所有与字符串p的字母排列相同的子串”问题,采用了滑动窗口算法和字符频率比较的方法。...滑动窗口 使用两个指针left和right来表示当前窗口的左右边界。right指针向右移动,扩展窗口,left指针在窗口大小超过p的长度时向右移动,收缩窗口。...2.4.3 总结: 这段代码利用滑动窗口和字符频率统计的技巧,能够在O(n)的时间内高效地找到字符串s中所有与字符串p字母排列相同的子串。...2.5 总结: 这段代码通过滑动窗口和字符频率统计相结合的方式,在字符串s中高效地找到所有与p的字母排列相同的子串。
暴力求解——>滑动窗口+哈希表 因为字符串p 的异位词的⻓度“m”⼀定与字符串p的⻓度相同,所以我们可以在字符串 s 中构 造⼀个⻓度为与字符串 p 的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟...滑动窗口 利用滑动窗口+哈希表解决问题 可以⽤两个⼤⼩为 26 的数组来模拟哈希表,⼀个来保存 s 中的⼦串每个字符出现的个 数,另⼀个来保存 p 中每⼀个字符出现的个数。...count:记录当前滑动窗口内与字符串p中字符频率一致的字符数。 滑动窗口通过right指针不断向右移动,将字符s[right]加入窗口,同时更新hash2数组和count计数。...字符数组与频率统计: 使用数组来记录字符出现的频率,并进行简单的数学运算实现高效统计。 双指针(Sliding Window)技巧: 通过两个指针控制一个窗口,用于高效地处理子串问题。...实现:使用两个指针(左指针和右指针)来维护一个窗口,该窗口在数组或字符串中滑动,以寻找满足特定条件的子数组或子串。 特点: 高效:通过调整指针位置来动态维护窗口,减少不必要的计算。
因此掌握滑动窗口非常基础且重要,接下来按照我的经验给大家介绍这个算法。 精读 滑动窗口使用双指针解决问题,所以一般也叫双指针算法,因为两个指针间形成一个窗口。 什么情况适合用双指针呢?...首先创建两个指针,分别叫 left 与 right,通过不断修改 left 与 right,让它们在数组间滑动,这个窗口大小就是符合题目要求的,当滑动完毕时,返回所有满足条件的窗口即可,记录其实很简单,...可以看到,这道题对于慢指针要如何慢,其实是根据值来判断的,如果 fast 的值与 slow 一样,那么 slow 就一直等着,因为相同的值要被忽略掉,让 fast 走就是在跳过重复值。...说完了常见的双指针用法,我们再来看一些比较难啃的特殊问题,这里主要讲两个,分别是 盛最多水的容器 与 接雨水。...这道题双指针的移动规则比较巧妙,与上面普通题目不一样,重点不是在是否会运用滑动窗口算法,而是能否找到移动指针的规则。 当然你可能会说,为什么两个指针要定义在最两端,而非别的地方?
如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。 在数组的区间问题上,暴力算法的时间复杂度往往是O(n^2)。...指针一般情况下将分为三种类类型,分别是: 类型 特点 快慢指针 两个指针步长不同,一般情况下,快的走两步,慢的走一步 对撞指针 两个指针分别指向头尾,并往中间移动,步长不确定,一般为1 区间指针 一般为滑动窗口...,两个指针及其间距视作整体,窗口有定长有变长,每次操作窗口整体向右滑动 不管是哪一种双指针,只考虑双指针部分的话 ,由于最多还是会遍历整个数组一次,因此时间复杂度取决于步长,如果步长是 1,2 这种常数的话...最大连续1的个数 III - 力扣(LeetCode) 思路: 使用 left 和 right 两个指针,分别指向滑动窗口的左右边界。 right 主动右移:right 指针每次移动一步。...最长回文子串 - 力扣(LeetCode) 思路: 回文中点可能是一个字符或者两个字符,以这为起点,两个左右指针分别扩散切判断是否相等,达到临界条件则存储和比较最大回文串。
尽可能使字符串相等题解集合 暴力法 滑动窗口 暴力法与滑动窗口的区别 前缀和 + 二分 + 滑动窗口 ---- 暴力法 枚举 s 的所有子串,判断当前和 t 中的子串的「汉明距离」总和是否不大于 maxCost...因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。...我分享一个滑动窗口的模板,能解决大多数的滑动窗口问题: def findSubArray(nums): N = len(nums) # 数组/字符串长度 left, right = 0,...res 滑动窗口中用到了左右两个指针,它们移动的思路是:以右指针作为驱动,拖着左指针向前走。...其实有了对于朴素解法的分析之后,无非就是两个方向: 优化第一个 O(n):减少需要枚举的滑动窗口长度 优化第二个 O(n):实现不完全滑动前缀和数组,也能确定滑动窗口长度是否合法 事实上第 2 点是无法实现的
文章顺序: 题目链接-》算法原理-》代码呈现 思想总结: 滑动窗口可以理解为是快慢双指针的一个分支,也是利用双指针一个在前一个在后,通过判断条件使两个指针形成一个大小不断变化的窗口,不断向前移动...滑动窗口的解题思想是在暴力枚举的思想上演化而来的,利用数据的单调性使快指针不用回退,通常能使算法复杂度在暴力枚举的基础上减少一个数量级。...这样我们不仅能解决问题,⽽且效率也会⼤⼤提升。 时间复杂度:虽然代码是两层循环,但是我们的 left 指针和 right 指针都是不回退的,两者 最多都往后移动 n 次。...p 的⻓度相同,所以我们可以在字符串 s 中构造⼀个⻓度为与字符串 p 的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量; 当窗⼝中每种字⺟的数量与字符串 p 中每种字⺟的数量相同时,则说明当前窗...这样就能判断两个串是否是异位词。
可以想象有一个红色的容量为3个数字的矩形窗口在沿着数字序列滑动,有两个指针right和left分别指向窗口的两端:left指向窗口左端,right指向窗口右端。...https://blog.csdn.net/sinat_21107433/article/details/100170044 分析:该题目应用滑动窗口法,需要设置两个指针left和right,把索引闭区间...分析:同样使用双指针滑动窗口法,本题另一点是判断当前窗口的字母是否是p的异位词的子串,本题采用的方法是用一个长度为26的数组n_p统计p中每个字母出现的次数,然后将当前窗口内的各个字母出现的次数n_s与...分析:同样使用双指针滑动窗口法,本题判断是否有重复出现的字母的方法与上一题类似,定义一个长度为256的数组window_arr并全部初始化为0;遍历当前窗口子串,将出现的字母对应的数组位置置为1,移动窗口...如果 S 中存在这样的子串,我们保证它是唯一的 分析:同样,采用双指针滑动窗口法,定义两个指针right和left,并都初始化为0,即字符串S的起始处。
滑动窗口技术可以帮助我们在O(n)的时间复杂度内解决一些需要遍历整个数组或字符串的问题。 滑动窗口的基本步骤包括: 初始化窗口的左右边界(通常为两个指针)。...滑动窗口思路: 我们使用两个指针**left**和**right**表示窗口的左右边界。 初始时两个指针都指向数组的起点。 扩展**right**指针,使窗口内的数字和逐渐增大。...滑动窗口思路: 使用两个指针**left**和**right**表示滑动窗口。 每次扩展**right**指针,将遇到的**0**记录在计数器**counter**中。...滑动窗口思路: 这道题可以看作是一个典型的滑动窗口问题,要求在一个数组中找到最多包含两个不同元素的最长子数组。我们通过滑动窗口来动态地调整当前子数组的左右边界,以找到满足条件的最长子数组。...滑动窗口思路: 这道题与滑动窗口的使用密切相关,我们通过一个滑动窗口来逐步遍历字符串 s,同时维护一个与字符串 p 的字符频率相匹配的哈希表,以此来判断当前窗口是否为 p 的字母异位词。
本篇主要总结关于滑动窗口的相关做题技巧与注意事项,滑动窗口也用到了双指针的内容,可以参考这篇文章【算法/学习】双指针-CSDN博客 ,本篇主要用于在了解滑动窗口的构造后,快速掌握滑动窗口的做题技巧与做题模板...找到字符串中所有字母异位词 思路: 该题与上题的字符串排列很像,由于我们需要找在字符串 s 寻找字符串 p 的异位词,故其异位词长度肯定与 p 长度相同,因此我们可以在 s 中构造一个定长的滑动窗口...,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。...但是因为字符串 s 中无法构造长度与字符串 p 的长度相同的窗口,所以这种情况需要单独处理。...最小覆盖子串 思路: 该题与上题思路相同。
Tag : 「双指针」、「滑动窗口」 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。...提示: s 和 p 仅包含小写字母 双指针(滑动窗口) 这是一道使用双指针实现滑动窗口的裸题。...事实上,我们只关心两个数组是否完全一致,因而我们能够只维护一个词频数组 来实现。 起始处理 p 串时,只对 进行词频字符自增操作。...同时,使用变量 统计 p 中不同字符的数量,使用变量 统计滑动窗口(子串)内有多少个字符词频与 相等。...当滑动窗口移动( 执行「抵消/恢复」)时,如果「抵消」后该字符词频为 ,说明本次右端点右移,多产生了一位词频相同的字符;如果「恢复」后该字符词频数量为 ,说明少了一个为词频相同的字符。
领取专属 10元无门槛券
手把手带您无忧上云