【Java刷题篇】滑动窗口

文章目录

  • 📃滑动窗口
    • 📜基本概念
    • 📜核心思路
  • ✍最大连续1的个数 III
  • ✍水果成篮

📃滑动窗口

📜基本概念

滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。
分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。
应用:什么情况可以用滑动窗口来解决实际问题呢?

  • 一般给出的数据结构是数组或者字符串
  • 求取某个子串或者子序列最长最短等最值问题或者求某个目标值时
  • 该问题本身可以通过暴力求解

📜核心思路

窗口的形成

在具体使用之前,我们知道窗口实际是两个指针之间形成的区域,那关键就是这两个指针是如何移动的。

  1. 初始时,左右指针left,right都指向第0个元素,窗口为[left,right),注意这里是左闭右开,因此初始窗口[0,0)区间没有元素,符合我们的初始定义
  2. 开始循环遍历整个数组元素,判断当前right指针是否超过整个数组的长度,是退出循环,否则执行第3步
  3. 然后right指针开始向右移动一个长度,并更新窗口内的区间数据
  4. 当窗口区间的数据满足我们的要求时,右指针right就保持不变,左指针left开始移动,直到移动到一个不再满足要求的区间时,left不再移动位置
  5. 执行第2步

✍最大连续1的个数 III

力扣链接: 最大连续1的个数 III
在这里插入图片描述
分析:
本题的难点在于如何对翻转K进行处理,如果我们按照一个数一个数来翻转的话,那就太麻烦了,没有get到这道题考察的知识点。
这里我们可以将翻转K个0转化理解为在一个数组中,找到一段连续的数字,其中这组数字拥有不超过K个0。这是就可以归为滑动窗口来解决这个问题了。

 public int longestOnes(int[] nums, int k) {int left = 0;int right = 0;int count = 0;int max = 0;while (right < nums.length){if (nums[right] == 0){count++;}while (count > k){if (nums[left] == 0){count--;}left++;}max = Math.max(max,right-left+1);right++;}return max;}

✍水果成篮

力扣链接: 水果成篮
在这里插入图片描述
分析
看完题目是不是有点蒙,那么看示例我们就很轻松的可以理解了。我现在来简要概括一下:
在一个数组中,查找一段连续的数组,这段数组中最多只能有两种数字。
简单理解完题目后,我们还是可以用滑动窗口的思想来做,但这道题与第一道并不相同,本题可以拥有两种数字,这时我们引入哈希的思想来处理这个问题。如果你没有学过哈希,那么也可以用数组来代替哈希。

public int totalFruit(int[] fruits) {int ret = 0;Map<Integer,Integer> hash = new HashMap<Integer,Integer>();for (int right = 0,left = 0; right < fruits.length; right++) {int in = fruits[right];hash.put(in,hash.getOrDefault(in,0)+1);while (hash.size() > 2){int out = fruits[left];hash.put(out,hash.get(out)-1);if (hash.get(out) == 0){hash.remove(out);}left++;}ret = Math.max(ret,right - left +1);}return ret;}

以数组来代替哈希:

 public int totalFruit(int[] fruits) {int n = fruits.length;int[] hash = new int[n+1];int ret = 0;for (int right = 0,left = 0,kinds = 0; right < n; right++) {int in = fruits[right];if (hash[in] == 0) kinds++;hash[in]++;while (kinds > 2){int out = fruits[left];hash[out]--;if (hash[out] == 0)kinds--;left++;}ret = Math.max(ret,right-left+1);}return ret;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/543503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞熙贝通实验室安全培训考试系统

一、系统概述 瑞熙贝通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台&#xff0c;旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化&#xff0c;提高实验室安全意识和能力&#xff0c;…

​如何使用 ArcGIS Pro 分析爆炸波及建筑

假设在某栋建筑内发生了爆炸&#xff0c;需要根据爆炸的范围分析出来波及的建筑&#xff0c;对于这一需求&#xff0c;我们可以通过ArcGIS Pro来实现&#xff0c;这里为大家介绍一下分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

修复 error Delete `␍` prettier/prettier 错误

修复 error Delete ␍ prettier/prettier 错误 问题背景报错信息报错原因解决办法修改CRLF----针对单个文件yarn run lint --fix 一键修复&#xff08;官方提供&#xff09; 问题背景 今天在使用 openapi 自动生成前端接口代码的时候&#xff0c;爆了一个类似 eslint 规范的错…

不可变集合

2. 3. 如果键值对超过10个的话 优化之后 要生成不可变的集合直接使用copyof就可以

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段内…

2024 Mazing 3 中文版新功能介绍Windows and macOS

iMazing 3中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序。iMazing中文版与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰…

【考研数学】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

产品推荐 - ALINX XILINX FPGA开发板 Artix-7 XC7A100T-2FGG484I

01开发板介绍 此款开发板采用核心板扩展板的模式&#xff0c;方便用户对核心板的二次开发利用。FPGA使用的是Xilinx公司的ARTIX-7系列的芯片&#xff0c;型号为XC7A100T-2FGG484I。在核心板使用了2片MICRON公司的MT41J256M16HA-125 DDR3芯片&#xff0c;组合成32bit的数据总线…

【Leetcode每日一题】 位运算 - 两整数之和(难度⭐)(37)

1. 题目解析 题目链接&#xff1a;371. 两整数之和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法的核心思路其实可以类比为我们小时候学习的加法运算。只不过这次&#xff0c;我们不是在纸上用铅笔算&#xff…

Docker容器化技术(使用Dockerfile制作镜像)

Docker中的镜像分层 Docker 支持通过扩展现有镜像&#xff0c;创建新的镜像。实际上&#xff0c;Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 1、Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相…