滑动窗口模板

滑动窗口模板分解

  • 特殊情况判断
  • 申请一个散列,用于记录窗口中每一个元素个数
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

### 单调队列在滑动窗口问题中的应用 单调队列用于解决特定类型的滑动窗口问题,特别是在需要频繁查询区间最值的情况下表现出色。该结构不仅支持标准的队列入队和出队操作,而且能确保内部数据按照一定顺序排列——通常是单调递增或递减的形式[^2]。 #### 算法伪代码模板 为了实现高效的滑动窗口最大/最小值计算,可以采用以下伪代码作为基础框架: ```plaintext for each element in the array: while queue is not empty and current_element violates monotonicity condition of queue: remove elements from rear end of queue add index of current_element to rear end of queue if front element of queue falls outside window bounds: remove it from front once we have processed at least 'k' elements (window size), start recording results using frontmost element. ``` 这段逻辑保证了每当遍历新元素时,都会调整队列以维护其单调性质;同时,在达到所需窗口大小之后,始终利用位于队头位置的那个索引来访问当前窗口内的极值[^1]。 #### Python 示例代码 下面是一个具体的Python实现例子,展示了如何运用上述原理来求解给定数组中每个长度为`k`的子序列的最大值: ```python from collections import deque def maxSlidingWindow(nums, k): result = [] q = deque() # Stores indices with decreasing values. for i in range(len(nums)): # Remove out-of-bound indices from the front. if q and q[0] <= i - k: q.popleft() # Maintain decreasing order by removing smaller numbers at back. while q and nums[q[-1]] < nums[i]: q.pop() q.append(i) # Start collecting answers after processing first complete window. if i >= k - 1: result.append(nums[q[0]]) return result if __name__ == "__main__": test_case = ([1,3,-1,-3,5,3,6,7], 3) print(maxSlidingWindow(*test_case)) ``` 此程序片段定义了一个函数 `maxSlidingWindow`, 它接收两个参数:一个是整型列表 `nums` 表示待处理的一维数组,另一个是正整数 `k` 指明滑动窗口宽度。通过构建并更新一个双端队列 `q` 来追踪可能成为候选最大值的位置,并最终返回这些最大值组成的列表[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值