滑动窗口小结


一、滑动窗口思路

  1. 使用双指针技巧,并且初始化 start=end=0 ,注意窗口范围,这里建立建议索引范围左闭右开,即 [start, end)
  2. 不断增大 end,扩大窗口 [start,end) ,直到窗口满足指定要求
  3. 满足要求后停止增大 end,转而缩小窗口,即不断增加 start,直到该窗口不满足要求。并注意适时更新结果
  4. 重复step2和step3,直到end达到范围尽头

二、模板

以字符串为例

void slideW(String s, String p) {
	// 定义记录存储变量
	HashMap<Character, Integer> recor = new HashMap();
	HashMap<Character, Integer> window = new HashMap();
	// 记录待比对的字符串元素
	for(int i=0; i<p.length()-1; i++) {
		char key = recor.put(key, recor.getOrDefault(key, 0)+1);
	}
	int start = 0, end = 0;
	int valid = 0; //valid用作判断窗口内满足 recor 条件的字符个数
	while(end < s.length()) {
		// r为送入滑动窗口的元素,并扩大窗口
		char r = s.charAt(end++);
		
		// 窗口内数据进行跟更新
		...
		
		// 判断左侧窗口是否要收缩
		while (condition of shrink) {
			// l 为要移出窗口的元素,并缩小窗口
			char l = s.charAt(start--);
			
			// 窗口内数据更新
			...
		}
	}
}

三、套模板考虑的问题

  1. end 扩大时,即窗口加入新元素时,应更新哪些数据?
  2. 窗口什么时候停止扩大,即移动 start 缩小窗口?
  3. 当移动 start 时,应该更新哪些数据?
  4. **结果在什么时候更新?**扩大或缩小窗口时?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值