LeetCode滑动窗口专题(刷题记录)
一、滑动窗口伪代码
二、滑动窗口经典题目
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()){
//步骤1.处理right指向的元素,加入到窗口
while(窗口满足条件){//也有可能是if来判断一次即可
//步骤2.计算结果
//步骤3.处理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;
}
}
加油啦!加油鸭,冲鸭!!!

浙公网安备 33010602011771号