1.从本质上来看 ,滑窗是双指针,一根指针指向左端点,一根指针指向右端点。
2.右指针移动是可以表示扩张窗口,左指针移动表示缩小窗口。
3.如果当前元素满足需求时,可以挪动右指针尝试更优解,并且更新需要记录的变量(元素,元素个数++等)
4. 如果当前窗口内的元素不满足条件,可以挪动左指针尝试调整,并且更新需要记录的变量(元素,元素个数–等)
5. 通过以上步骤窗口就可以滑动起来了,在滑动的过程中及时更新答案,一般这类问题都是求最大或者最小

关键点在于找到一个 不满足条件的情况 使得左指针移动,这样可以简化问题。找到不合理的情况并且及时调整是滑动窗口的关键。

因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。

Leetcode 滑动窗口类型题 <持续更新>

  • 1004.最大连续1的个数|||
  • 1052. 爱生气的书店老板

1004.最大连续1的个数|||

class Solution {public int longestOnes(int[] A, int K) {int N=A.length;int left=0;int right=0;int res=0;int zero_number=0;while(right<N){if(A[right]==0)zero_number++;while(zero_number>K){if(A[left++]==0)zero_number--;}res=Math.max(res,right-left+1);right++;}return res;}
}

滑动窗口模板:

def findSubArray(nums):N = len(nums) # 数组/字符串长度left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间sums = 0 # 用于统计 子数组/子区间 是否有效,根据题目可能会改成求和/计数res = 0 # 保存最大的满足题目要求的 子数组/子串 长度while right < N: # 当右边的指针没有搜索到 数组/字符串 的结尾sums += nums[right] # 增加当前右边指针的数字/字符的求和/计数while 区间[left, right]不符合题意:# 此时需要一直移动左指针,直至找到一个符合题意的区间sums -= nums[left] # 移动左指针前需要从counter中减少left位置字符的求和/计数left += 1 # 真正的移动左指针,注意不能跟上面一行代码写反# 到 while 结束时,我们找到了一个符合题意要求的 子数组/子串res = max(res, right - left + 1) # 需要更新结果right += 1 # 移动右指针,去探索新的区间return res

滑动窗口中用到了左右两个指针,它们移动的思路是:以右指针作为驱动,拖着左指针向前走。右指针每次只移动一步,而左指针在内部 while 循环中每次可能移动多步。右指针是主动前移,探索未知的新区域;左指针是被迫移动,负责寻找满足题意的区间。

模板的整体思想是:

定义两个指针 left 和 right 分别指向区间的开头和结尾,注意是闭区间;定义 sums 用来统计该区间内的各个字符出现次数;
第一重 while 循环是为了判断 right 指针的位置是否超出了数组边界;当 right 每次到了新位置,需要增加 right 指针的求和/计数;
第二重 while 循环是让 left 指针向右移动到 [left, right] 区间符合题意的位置;当 left 每次移动到了新位置,需要减少 left 指针的求和/计数;
在第二重 while 循环之后,成功找到了一个符合题意的 [left, right] 区间,题目要求最大的区间长度,因此更新 res 为 max(res, 当前区间的长度) 。
right 指针每次向右移动一步,开始探索新的区间。

模板中的 sums 需要根据题目意思具体去修改,本题是求和题目因此把sums 定义成整数用于求和;如果是计数题目,就需要改成字典用于计数。当左右指针发生变化的时候,都需要更新 sums 。
另外一个需要根据题目去修改的是内层 while 循环的判断条件,即: 区间 [left, right][left,right] 不符合题意 。对于本题而言,就是该区间内的 0 的个数 超过了 2

补充一个不需要缩小窗口的代码,窗口扩大的条件是:窗口元素之和 + K >= 窗口的尺寸

class Solution {public int longestOnes(int[] A, int K) {int left=0;int right=0;int all_sum=0;int N=A.length;while (right < N) {all_sum+=A[right];if(all_sum+K<right-left+1){all_sum-=A[left];++left;}++right;}return right-left;}
}

1052. 爱生气的书店老板

解析:
由于「技巧」只会将情绪将「生气」变为「不生气」,不生气仍然是不生气。
我们可以先将原本就满意的客户加入答案,同时将对应的 customers[i] 变为 0。
之后的问题转化为:在 customers 中找到连续一段长度为 x 的子数组,使得其总和最大。这部分就是我们应用技巧所得到的客户。

class Solution {public int maxSatisfied(int[] cs, int[] grumpy, int x) {int n = cs.length;int ans = 0;for (int i = 0; i < n; i++) {if (grumpy[i] == 0) {ans += cs[i];cs[i] = 0;}}int max = 0, sum = 0;for (int right = 0, left = 0; right < n; right++) {sum += cs[right];if (right - left + 1 > x) {sum-=cs[left];++left;}max=Math.max(max,sum);}return ans + max;}
}
class Solution {public int[][] flipAndInvertImage(int[][] A) {int n=A.length;for(int i=0;i<n;i++){for(int j=0;j<(n+1)/2;j++){int tmp=A[i][j]^1;A[i][j]=A[i][n-j-1]^1;A[i][n-j-1]=tmp;}}return A;}
}

【leetcode个人练习记录】 滑动窗口的问题相关推荐

  1. LeetCode刷题:滑动窗口模板以及典型例题

    作者:fuxuemingzhu 链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/solution/fen-xiang-hua- ...

  2. LeetCode 76. 最小覆盖子串 (滑动窗口哈希表)

    LeetCode 76. 最小覆盖子串 思路: 准备一个map1记录字符串t(字符, 字符个数) 准备一个map2记录在s的窗口中所包含的t串字符(字符,字符个数) 左端点收缩条件:窗口内已经覆盖了t ...

  3. LeetCode算法思想之滑动窗口

    文章目录 前言 开撸 1.lc209 长度最小的数组 2.lc643 子数组最大平均数I 3.lc3 无重复字符的最长子串 4.1695. 删除子数组的最大得分 5. lc76 最小覆盖字串 前言 滑 ...

  4. LeetCode Contains Duplicate III(滑动窗口)

    问题:给出一个数组,要求  思路:第一种方法使用枚举法,对于i,则判断[0,i-k]之间的数与nums[i]的绝对值是否小于等于t. 第二种方法基于set的滑动窗口.在遍历数组时,先看集合中比当前遍历 ...

  5. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  6. LeetCode 滑动窗口(Sliding Window)类问题总结

    导语 滑动窗口类问题是面试当中的高频题,问题本身其实并不复杂,但是实现起来细节思考非常的多,想着想着可能因为变量变化,指针移动等等问题,导致程序反复删来改去,有思路,但是程序写不出是这类问题最大的障碍 ...

  7. 【LeetCode笔记】剑指Offer 59. I 滑动窗口的最大值(Java、单调队列)

    文章目录 题目描述 思路 && 代码 1. 暴力法 O(n2n^2n2) && O(1) 2. 单调队列辅助 O(n) && O(n) 二刷 打卡第十天 ...

  8. 滑动窗口:给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

    一.问题描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 注意: 字符串长度 和 k ...

  9. 算法与数据结构(一):滑动窗口法总结

    滑窗法在算法题中大量应用,其思想简洁强大,但是往往在维护左右指针时候容易出错,现总结整理如下: 1. 介绍 滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 =.=),可以用来解决一些查找满足一 ...

  10. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

最新文章

  1. 自定义Title(可以实现类似于携程网上价格的显示方式)
  2. 2020年后台开发程序员应该学习的8大技术
  3. TEG《选择》乘风破浪 · 披荆斩棘
  4. 发红包android
  5. 通过Python实现马尔科夫链蒙特卡罗方法的入门级应用
  6. c语言 将点同时保证x坐标从小到大,y坐标从小到大地排序,C语言第五六次作业.ppt...
  7. Linux四种共享内存技术(附源码):SystemV、POSIX mmap、memfd_create、dma-buf
  8. shell进阶之tree、pstree、lsof命令详解
  9. 汇编语言输出斐波那契数列
  10. 【广东大学生网络攻防大赛-WriteUp(非官方)】Reverse | pyre
  11. 拯救 中国区 谷歌翻译 解决方案
  12. 无标号有根树计数与无标号无根树计数
  13. 微信拉黑和删好友,哪个更绝情?
  14. html5苹果手机视频不自动播放,HTML5 解决苹果手机不能自动播放音乐问题
  15. 什么是Anti-DDoS流量清洗?
  16. abb机器人码垛编程详解_ABB机器人码垛程序
  17. 指数和个股的对数收益率正态性检验
  18. 算法总结-UT哈希算法
  19. 10个SaaS的常见问题解答告诉你SaaS是什么
  20. Vue 点击文字改变文字颜色

热门文章

  1. 华为鸿蒙2.0开发文档及API
  2. wxPython PyQT
  3. 利用Instrumentation单元测试模块控制安卓手机进行各项操作(微信)
  4. vue面试题、react面试题大全、ES6等....
  5. MySQL根据某一个字段合并重复列
  6. 中国集成电路产业人才白皮书北京发布--李武宜
  7. markdown文本居中,段首缩进的方法
  8. Day 5 字典以及字典的用法
  9. 计算机乘法算法流程,布斯乘法算法
  10. Innodb中聚簇索引