算法 之 滑动窗口(定长滑动窗口+不定长滑动窗口)

文章目录

  • 窗口问题一直是一类十分重要的题目,对于是否规定这个窗口的长度,也可以细分为定长滑动窗口不定长滑动窗口,其中不定长滑动窗口也可以分为求解最长子数组求解最短子数组求解子数组的个数
  • 正所谓法无定法,在于因时因势,首先得先掌握这个基础知识,然后在面对新的问题的时候,可以学会灵活变通,学会转化为已经学过的内容

定长滑动窗口
窗口之定长滑动窗口

  • 定长滑动窗口,题目会规定这个窗口的值,简单的问题也就是求解长度为K的子串中某个元素的数量?,当然难的问题会比较难转化!
  • 总的来说,定长滑动窗口得弄清楚几个问题:
    • 入:下标为i的元素进入窗口,更新统计量,如果i<k-1就重复执行入的操作(下标是从0开始的,所以i<k-1的时候窗口最多只有k-1的元素)
    • 更新:更新答案。一般是更新最大值/最小值
    • 出:下标为i-k+1的元素离开窗口,更新统计量
  • 下面给出对应的伪代码
python 复制代码
# 假设求解的窗口为k的字符串(数组)出现的某个字符的最大/最少数目(平均值)
ans = tmp = 0
for i,c in enumerate(s):
	# 1.进入窗口
	if #对这个字符c进行判断:
		#更新这个tmp 
	if i < k -1:
		# 不够k,继续
		continue
	# 2.满足窗口的长度,更新这个ans
	ans = max/min(ans,tmp)
	# 3.离开窗口
	if s[i-k+1] #  条件判断
		# 更新tmp
# ans 就是答案
  • 上面的代码由于是伪代码,所以并不是很好理解,所以还是建议结合上面的定长滑动窗口的另一篇博客进行理解

不定长滑动窗口

不定长滑动窗口

  • 不定长滑动窗口分为:
    • 求解最长子数组:具体来说,就是求解满足条件的子串或者子数组的最大长度,一般会结合哈希表记录区间的内的元素的数目
    • 求解最短子数组:和求解这个最长子数组的解法相似,但是具体的细节的判断要注意
    • 求解子数组的个数:也分为越长越合法越短越合法恰好型问题,这个越长、越短、与恰好,是对于条件的限定,也就是类似于区间的和至少为target,至多为target或者刚好为target的子数组的个数

求解最长子数组

  • 给出对应的伪代码
python 复制代码
# 提前有这个left,ans,count
for right,c in enumerate(s):
	# 不管怎么样都是先加入这个元素
	while # 判断是否满足条件:
		# 如果不满足就更新这个left,缩小窗口
	ans = max/min # 更新答案

求解最短子数组

  • 给出对应的伪代码
python 复制代码
#  使用left,ans,count
for right ,c in enumerate(s):
	# 直接加入新的元素
	while count - s[left] >= k? # 就是判断此时要是缩小窗口是否还满足条件
		# 如果缩小窗口还满足条件,就缩小窗口
		count -= s[left] # 可以替换成其他的操作
		left += 1
	if count >= k:
		# 更新这个ans

求解子数组的个数

  • 越长越合法至少满足型,更新答案的时候,当当前的区间是满足最低标准的时候left左边的全部元素加入窗口都是满足情况的,所以区间的更新是ans++left
python 复制代码
# 可以不用这个right 记录
# 提前定义好left ,count
left = count =0
# 直接枚举元素,假设这个是字符串
for c in s:
	# 可以借助哈希表进行统计
	cnt[c]+= 1
	# 判断是否满足情况
	while len(cnt)>=k:
		# 缩小窗口
		out = s[left]
		cnt[out] -= 1
		if cnt[out] == 0:
			del cnt[out]
		left += 1
	# 更新这个ans
	ans += left

越短越合法

  • 越短越合法,我们只需找到满足条件的最大情况,然后更新答案的时候,这个满足的子数组的个数就是区间的长度,也就是更新的时候是ans+= right-left+1
python 复制代码
# 定义left,ans,count

for right,c in enumerate(nums):
	# 更新count ,加入新元素
	while count >= k: # 求解的是最大的满足情况,所以超过的时候得缩小窗口
		# count 减去左端点部分
		left += 1
	ans += right - left + 1
	

恰好型

  • 恰好型:计算多少个元素 恰好等于k的子数组,可以变化为
    • 计算有多少个元素和 >=k的子数组
    • 计算有多少个元素和 >=k+1的子数组
  • 最终的答案就是f(k)-f(k+1)
相关推荐
生成论实验室3 分钟前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》导论:在破碎的世界寻找统一语法
人工智能·科技·算法·架构·创业创新
承渊政道3 分钟前
【动态规划算法】(两个数组的DP问题深度剖析与求解方法)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
杨连江8 分钟前
原子级平面限域协同晶核诱导定向生长单层鳞片石墨的研究
算法
MATLAB代码顾问13 分钟前
混合粒子群-模拟退火算法(HPSO-SA)求解作业车间调度问题——附MATLAB代码
算法·matlab·模拟退火算法
Felven18 分钟前
C. Prefix Min and Suffix Max
算法
加农炮手Jinx18 分钟前
LeetCode 26. Remove Duplicates from Sorted Array 题解
算法·leetcode·力扣
加农炮手Jinx18 分钟前
LeetCode 88. Merge Sorted Array 题解
算法·leetcode·力扣
格林威19 分钟前
线阵工业相机:如何计算线阵相机的行频(Line Rate)?公式+实例
开发语言·人工智能·数码相机·算法·计算机视觉·工业相机·线阵相机
yueyue54322 分钟前
透过现象看本质:以fast_lio架构的整套算法的局部避障改为TEB算法为例深度探讨——如何成为一个合格的算法架构师?
算法·架构
梨花爱跨境22 分钟前
红人视频×A10算法:亚马逊转化率与流量闭环实战
算法