滑动窗口 C++

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


介绍

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。也可以理解为一种双指针的做法。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、滑动窗口模板

  1. 定义变量:确定需要维护的变量:数之和,最大最小长度,哈希表等
  2. 滑动窗口:确定滑动窗口的左右边界,开始滑动窗口
  3. 合法更新:在滑动窗口有效的情况下,合法的更新需要维护的变量
  4. 非法更新(二次更新):在滑动窗口无效或者即将无效的情况下,更新维护的变量,并且收缩滑动窗口的左边界,非法更新的两种情况:
    滑动窗口的长度是固定的!!! 使用 if条件来更新
    滑动窗口的长度是可变的!!! 使用 while条件来更新
  5. 返回与得到答案
int func(vector<int>& nums,int k)
{
	//Step1. 定义维护变量:
	1. unordered_map<char,int> m;	//在需要统计字符或者数字出现的次数的时候,使用哈希表
	2. int sum=0,res=0;			//在需要记录整数数组中的子序列和或者其他求和时,使用sum记录每一次滑动窗口的子和,再利用res得到最大的或者最小的结果	
	3. int len=0,start=0;		//得到字符串的字串,len记录字串长度,start标识字串开始位置

	//Step2. 确定滑动窗口的边界,开始滑动:
	int left=0,right=0;
	while (right< n) 	// n: 数组长度	
	{
		//Step3. 合法更新:每进行一次滑动时,必须要更新的变量:如Step1的哈希表,sum,res,len与start等等
		......
		if (满足条件) //满足某一种条件:例如滑动窗口的长度:right-left+1 与某个值相等时,则进行一次判断,保存临时结果
		{
			//更新:res=max(res,sum)  ......
		}
		//Step4: 非法更新
		//(1): 滑动窗口的长度固定:使用if来更新窗口
		while (right-left+1 > m.size())//举个例子:无重复字符的最长字串,你的窗口长度大于哈希表的长度,则一定含有重复元素,因此更新左边界,使用if
		{
			.....
		}
		//(2): 滑动窗口的长度不固定,使用while来更新窗口	
		if (right>=k-1)//举个例子:子数组的最大平均值,子数组规定长度不能超过k,因此滑窗长度固定
		{
			.....
		}
		right++;//此处可以改为for循环
	}
	return res;//Step5: 返回结果
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值