一、滑动窗口伪代码
二、滑动窗口经典题目
01.643. 子数组最大平均数 I
02.209. 长度最小的子数组
03.3. 无重复字符的最长子串
04.76. 最小覆盖子串(难)
05.485. 最大连续 1 的个数
06.487. 最大连续1的个数 II
07.1004. 最大连续1的个数 III
08.1151. 最少交换次数来组合所有的 1
09.30. 串联所有单词的子串(难)
10.567. 字符串的排列
11.763. 划分字母区间
12.845. 数组中的最长山脉(难)
13.159. 至多包含两个不同字符的最长子串
14.187. 重复的DNA序列
15.340. 至多包含 K 个不同字符的最长子串
16.424. 替换后的最长重复字符
17.713. 乘积小于K的子数组
18.904. 水果成篮
19.1100. 长度为 K 的无重复字符子串
20.1176. 健身计划评估
21.1208. 尽可能使字符串相等
22.1234. 替换子串得到平衡字符串
总结
模板:
int left = 0 , right = 0; while(right < nums.length()){ //处理right指向的元素,加入到窗口 while(窗口满足条件){//也有可能是if来判断一次即可 //计算结果 //处理left指向的元素,将其从窗口中剔除掉 left++; } right++; }
01.643. 子数组最大平均数 I
//时间:o(n) //空间:o(n) class Solution { public double findMaxAverage(int[] nums, int k) { //窗口左边界 int left = 0; //窗口右边界 int right = 0; //大小为k的窗口的累加和(动态变化的) int currWindowSum = 0; //维护最大值 int maxSum = Integer.MIN_VALUE; //右边界 while(right < nums.length){ //处理右边的指针 currWindowSum += nums[right]; //满足窗口的条件,达到了固定窗口的大小,处理左边的指针 if(right - left + 1 == k){ maxSum = Math.max(maxSum,currWindowSum); //currWindowSum要先减掉num[left],然后left右移 currWindowSum -= nums[left++]; } //如果没有达到窗口的大小:只有right右移 //如果达到窗口的大小了:left和right一起右移一个单位 right++; } //注意返回类型是 double return (double)maxSum / k; } }