算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好,我是怒码少年小码。

从本篇开始,我们就要开始算法的新篇章了——四大思想:滑动窗口、贪心、回溯、动态规划。现在,向我们迎面走来的是——滑动窗口思想!😝

滑动窗口思想

概念

在数组双指针里,我们介绍过"对撞型"和"快慢型"两种方式,而滑动窗口思想就是快慢型的特例。

实际使用

计算机网络中有滑动窗口协议(Sliding Window Protocol),该协议是TCP实现流量控制等的核心策略之一。事实上与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度思考问题,例如hystrix、sentinel等框架等都使用了这种思想。

理解

这个思想其实很好理解,如下图,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。

这个过程有点像火车在铁轨上跑,原始数据可能保存在一个很大的空间里(铁轨),但是我们标记的小区间就像一列长度固定的火车,一直向前走。

有了区间,就可以造题了,例如让你找序列上三个连续数字的最大和是多少、子数组平均数是多少(LeetCode643)等等。

窗口和滑动的含义:

  1. 窗口:窗口其实就是两个变量leftright之间的元素,也可以理解为一个区间。窗口大小不一定固定,思考两种场景:
  • 如果是固定的,一般要先确定窗口是否越界,再执行逻辑处理。则一般会让你求哪个窗口的元素最大、最小、平均值、和最大、和最小等类型的问题

  • 如果是可变的窗口,一般先判断是否满足要求,再执行逻辑处理。则一般要求一个序列里最大、最小窗口是什么

  1. 滑动:说明这个窗口是移动的,事实上移动的仍然是leftright两个变量,而不是序列中的元素。当变量移动时,其中间的元素必然会发生变化,因此就有这种不断滑动的效果.

注意事项

  1. 解题最终要落实到数组上,特别需要注意边界处理
  2. 有些元素的比较、判断等比较麻烦,要借助集合等工具,而且处理过程中还有一些技巧(常见方法的使用等)
  3. 堆,堆结构非常适合在流数据中找固定区间内的最大、最小等问题。因此滑动窗口经常和堆一起使用可以完美解决很多复杂问题.

那双指针和滑动窗口啥区别呢?

答:根据性质看到,滑动窗口是双指针的一种类型,主要关注两个指针之间元素的情况,范围更小一些,而双指针的应用范围更大,花样也更多。

入门小题

LeetCode 643:给你一个由 n 个元素组成的整数数组 nums 和一个整数 k。请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

先自己思考一下,不难但是想要完全做对还是要细心。例如我一开始就是先定义一个变量max保存最大值,然后left和right保存窗口两端。只要right不到数组边界,滑动窗口每次一变我就计算窗口内的元素之和,然后和max比较看看是否保存。

但是我一开始把max定为0,忽略数组内k个最大连续组序列的和是负数的情况。力扣上我又换回C++用INT_MIN来定义结果是直接超时了啊哈哈哈😁。正确代码如下:

public double findMaxAverage(int[] nums, int k) {if(k > nums.length || nums.length < 1 || k < 0){return 0;}int len = nums.length;int windowSum = 0;//先求出第一个窗口内的元素和for(int i = 0 ; i < k ;i++){windowSum = windowSum + nums[i];}//然后依次遍历,知道right达到数组边界,每次窗口变化选择变化前后最大的保存int maxSum = windowSum;for(int right = k ; right < len ; right++){windowSum = windowSum + nums[right] - nums[right - k];maxSum=Math.max(maxSum,windowSum);}return (double) maxSum / k;
}

最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

示例 1:

  • 输入:nums = [1,3,5,4,7]
  • 输出:3
  • 解释:最长连续递增序列是 [1,3,5], 长度为3。
    尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

示例 2:

  • 输入:nums = [2,2,2,2,2]
  • 输出:1
  • 解释:最长连续递增序列是 [2], 长度为1。

思路:如果当前遍历到的元素比它左边的那一个元素要严格大,right就增加;
否则就将left跳到right的起始位置,重新开始计算。

public int findLengthOfLCIS(int[] nums) {int left=0,right=0;int res=0;while(right < nums.length){//右侧的新元素比左侧小,则重新开始记录left的位置if(right > 0 && nums[right - 1] >= nums[right]){left = right;}right++;res=Math.max(res,right - left);}return res;
}

本题还有多种解法,另外一种思路是一边遍历,一边统计每个递增区间的长度,如果长度超过之前所有区间的长度,就将其保留,代码如下:

public int findLengthOfLCIS(int[] nums) {int curLen = 1;//当前递增区间的长度int res = 1;for(int i = 1;i < nums.length;i++){if(nums[i - 1] >= nums[i]){//不满足要求,重新进行数字计算curLen = 1;}else{curLen++;}res = Math.max(curLen,res);}return res;
}

可见就算不知道滑动窗口我们也能解决,所以滑动窗口就是个名字,不要被这些概念吓到。

END

本篇只是一个入门,很多时候往往存在即合理,这种思想一定在某个地方发挥着作用,我们下篇探讨!😎再见~

关注微信公众号:怒码少年。回复关键词【电子书】,领取多本计算机相关电子书
公众号后台开启了咨询业务,欢迎大家向我提问,免费,为爱发电😎

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

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

相关文章

Java Stream 的使用

Java Stream 的使用 开始中间操作forEach 遍历map 映射flatMap 平铺filter 过滤limit 限制sorted 排序distinct 去重 结束操作collect 收集toList、toSet 和 toMapCollectors.groupingByCollectors.collectingAndThen metch 匹配find 查询findFirst 与 findAny 的使用Optional …

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

SpringBoot3数据访问

SpringBoot3数据访问 SpringBoot整合 Spring、SpringMVC、MyBatis进行数据访问开发。 整合SSM场景 整合步骤 1、创建SSM整合项目 ①数据库准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT COMMENT 编号,login_name varchar(200)…

[Linux]tcpdump抓包工具

windows中的抓包工具&#xff1a;wireshark linux中的抓包工具&#xff1a;tcpdump cpdump是Linux系统中自带抓包工具 [rootIKUN ~]# rpm -q tcpdump tcpdump-4.9.0-5.el7.x86_64 [rootIKUN ~]# tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.1…

又卷又累,救救一个将被随机拖死的程序员!

前两天在小红书上看到有人吐槽&#xff1a;“国内做程序员性价比不高&#xff0c;又卷又累&#xff0c;个人时间都被拖死了。” 现在普遍来讲&#xff0c;“卷”都是打工人的现状。 而至于国内程序员性价比不高的话&#xff0c;确实是肉少僧多。工作强度一加持&#xff0c;累自…

使用jedis连接虚拟机redis报错 Failed to connect to any host resolved for DNS name

问题描述&#xff1a; 导致该问题发生的原因可能是虚拟机没有开放6379端口。 解决方案&#xff1a; 首先检查redis.conf的bing配置是否被注释了&#xff0c;如果没有将其注释 第二步&#xff0c;将保护模式设置为no 第三步&#xff0c;接下来可以使用命令查看6379端口是否…

Java学习之路 —— Day3(内部类、枚举、泛型、API)

文章目录 1. 内部类2. 枚举3. 泛型 1. 内部类 成员内部类 就是类中的一个普通成员&#xff0c;类似普通的成员方法、成员变量。&#xff08;套娃&#xff09; public class Outer {public class Inner {private String name;public static String school;public String getNa…

hadoop 如何关闭集群 hadoop使用脚本关闭集群 hadoop(八)

1. hadoop22, hadoop23, hadoop24三台机器 2. namenode 所在hadoop22关闭 hdfs: # 找到/etc/hadoop位置 cd /opt/module/hadoop-3.3.4/etc/hadoop # 找到shell脚本&#xff0c;关闭即可sbin/stop-dfs.sh 3. 关闭yarn脚本&#xff0c;我的在hadoop23&#xff1a; # 找到/etc…

容斥dp,二项式反演

前言 由于水平有限&#xff0c;这篇文章比较难懂&#xff0c;并且也有很多不够透彻的地方&#xff0c;如果您有任何的看法&#xff0c;非常感谢您私信指导。 容斥dp 用dp的方法来描述容斥&#xff0c;大概的想法是&#xff0c;把容斥系数分到每一步里去乘。 通常当你有容斥…

HP惠普暗影精灵9P OMEN 17.3英寸游戏本17-cm2000(70W98AV)原装出厂Windows11-22H2系统镜像

链接&#xff1a;https://pan.baidu.com/s/1gJ4ZwWW2orlGYoPk37M-cg?pwd4mvv 提取码&#xff1a;4mvv 惠普暗影9Plus笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、 Office办公软件、惠普电脑管家、OMEN Command Center游戏控制中心等预装程序 所需要工具&#xff1a;3…

Go 14岁了

今天我们庆祝Go开源十四周年&#xff01;Go度过了美好的一年&#xff0c;发布了两个功能齐全的版本和其他重要的里程碑。 我们在2月份发布了Go 1.20&#xff0c;在8月份发布了Go 1.21&#xff0c;更多地关注实现改进而不是新的语言更改。 在Go 1.20中&#xff0c;我们预览了配置…

深度学习 植物识别算法系统 计算机竞赛

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…