作者:fuxuemingzhu
链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/solution/fen-xiang-hua-dong-chuang-kou-mo-ban-mia-f76z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

  • 滑动窗口模板
  • 1004. 最大连续1的个数 III

滑动窗口模板

《挑战程序设计竞赛》这本书把滑动窗口形象地叫做【虫取法】。因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。

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循环中每次可能移动多步。右指针是主动前移动,探索未知的新区域;左指针是被迫移动,负责寻找满足题意的区间。

模板的整体思想是:

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

1004. 最大连续1的个数 III

https://leetcode-cn.com/problems/max-consecutive-ones-iii/

解题思路

重点:题意转换。把「最多可以把 K 个 0 变成 1,求仅包含 1 的最长子数组的长度」转换为 「找出一个最长的子数组,该子数组内最多允许有 K 个 0 」。

经过上面的题意转换,我们可知本题是求最大连续子区间,可以使用滑动窗口方法。滑动窗口的限制条件是:窗口内最多有 K 个 0。

代码思路

  • 使用left和right两个指针,分别指向滑动窗口的左右边界。
  • right主动右移动:right指针每次移动一步。当A[right]为0,说明滑动窗口内增加了一个0;
  • left被动右移动:判断此时窗口内0的个数,如果超过了K,则left指针被迫右移动,直至窗口内的0的个数小于等于K为止。
  • 滑动窗口长度的最大值即为所求。

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

LeetCode刷题:滑动窗口模板以及典型例题相关推荐

  1. leetcode算法题--滑动窗口的最大值

    原题链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 滑动窗口: vector<int> ...

  2. LeetCode刷题模板(1):《我要打10个》之二分法

    Author       :  叨陪鲤 Email         : vip_13031075266@163.com Date          : 2021.01.23 Copyright : 未 ...

  3. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  4. Leetcode刷题

    刷题 leetcode 1.两数之和 #哈希表 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int ...

  5. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  6. C#LeetCode刷题-剑指Offer

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-剑指Offer | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode剑指Offer ...

  7. GitHub疯传,这个Leetcode刷题手册到底有多流弊?

    写在前面 最近一个读者和我反馈,他坚持刷题2个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,期间面字节跳动还遇到了原题...并表示目前国内的大厂和一些独角兽,已经越来越效仿硅谷公司的做法,通过面试给 ...

  8. GitHub标星90K,这份持续霸榜的Leetcode刷题手册到底有多强?

    写在前面 最近一个读者和我反馈,他坚持刷题2个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,期间面字节跳动还遇到了原题...并表示目前国内的大厂和一些独角兽,已经越来越效仿硅谷公司的做法,通过面试给 ...

  9. LeetCode刷题框架总结

    LeetCode刷题框架总结 01 | 数组和链表遍历框架 1.数组遍历框架,典型的线性迭代结构 void traverse(int[] arr) {for (int i = 0; i < ar ...

最新文章

  1. android监听器在哪里创建,[转载]android开发中创建按钮事件监听器的几种方法
  2. HBase数据快速导入之ImportTsvBulkload
  3. 对称加密——对入参进行DES加密处理
  4. [转帖]最值得了解的10大开源技术
  5. Spring Boot:快速入门教程
  6. mysql批量修改字段字符集_MySQL字符集修改实战教程
  7. Embeded linux之移植boa
  8. 开源当自强:我们不是“便宜货”
  9. 计算机软考笔记之《数据库基础》
  10. 蚂蚁金服隗华:十五年时间见证分布式数据库的崛起
  11. 24.8. UNION
  12. hive 操作(三)——hive 的数据模型
  13. GridViewObjectDataSource新特性小记 懒人篇(一) 分页上路
  14. VS2013扩展——Advanced JavaScript outlining,让js和css也折叠
  15. 卸载精灵 v4.2 是什么
  16. 熔断机制什么意思_熔断机制是什么意思?
  17. 初学 博弈论 又称对策论 Game Theory
  18. QChart动态生成图表(曲线)
  19. 游戏设计模式-观察者模式
  20. Redis的五种数据结构原理分析(中)

热门文章

  1. 版本控制入门-----搬进Github
  2. Datatable Initialization - 使用objects数据源初始化
  3. Android 智能问答机器人的实现
  4. distable:table-cell
  5. 好文转贴(3) —— 每个应用程序都有一个恐怖地下室 & 两个最容易被人忽略的基本代码优化技术...
  6. 把html变成桌面的软件,5 分钟把任意网站变成桌面软件
  7. 拉马车 的游戏 c语言编程,蓝桥杯 拉马车(模拟)
  8. gradle exclude_Gradle学习记录020 java工程的测试 part1
  9. 坐标偏差大_控制点的坐标复核(二)
  10. js 动态拼接html 正则,在JavaScript中使用动态(可变)字符串作为正则表达式模式...