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()){
	//处理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;
    }
}

  

加油啦!加油鸭,冲鸭!!!
原文地址:https://www.cnblogs.com/clarencezzh/p/15505816.html