滑动窗口模板

滑动窗口模板分解

  • 特殊情况判断
  • 申请一个散列,用于记录窗口中每一个元素个数
int[] need=new int[128];
  • 定义左指针、记录条件的变量与结果集
int left=0,count=..,result=..;
  • 开始滑动窗口,i可代替右指针
for(int i=0;i<S.length;i++){
  • 更新新元素在散列中的数量
need[sArr[i]]--;
  • 根据窗口的变更结果来改变条件值
if(need[sArr[i]] == > < ){
count++;
}
  • 如果当前条件不满足,一直移动左指针直至条件满足为止
while(count>k||...){
...
if(...){
count--;
}
need[sArr[left]]++;
left++;
}
  • 更新结果
results=..
}
return results;

整体模板

public class 模板 {
    public int slidingWindowTemplate(String[] a, ...){
        // 输入参数有效性判断
        if(...) {
            ...
        }
        // 申请一个散列,用于记录窗口中具体元素的个数情况
        // 这里用数组的形式呈现,也可以考虑其他数据结构
        int[] need = new int[...];
        // 预处理(可省), 一般情况是改变 hash
        ...
        // l 表示左指针
        // count 记录当前的条件,具体根据题目要求来定义
        // result 用来存放结果
        int left= 0, count = ..., result = ...;
        for( int i = 0; i < S.length; i++) {
            // 更新新元素在散列中的数量
            hash[S[i]]--;
            // 根据窗口的变更结果来改变条件值
            if(need[S[i]] == ...) {
                count++;
            }
            // 如果当前条件不满足,移动左指针直至条件满足为止
            while(count > K || ...) {
                ...
                if(...) {
                    count--;
                }
                need[A[left]]++;
                left++;
            }
            // 更新结果
            results = ...
        }
        return results;
    }
}

利用滑动模块模板解决滑动模块题:
1、3:中等leetcode滑动窗口模板之无重复字符的最长子串3
2、76:困难 leetcode滑动窗口模板之最小覆盖子串76
3、438:中等leetcode滑动窗口模板之找到字符串中所有字母异位词438
4、424:中等leetcode滑动窗口模板之替换后的最长重复字符424
5、567:中等leetcode滑动窗口模板之字符串的排列567
6、992:困难leetcode滑动窗口模板之k个不同整数的子数组992

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值