其实滑动窗口类似队列一样,对一些数组区间挺好用的

滑动窗口

输入一个长度为n的序列,寻找尽量长的子序列,使得该子序列中没有相同的元素

思路:每次进来一个a[R],窗口拉伸用map记录出现的元素的下标,如果a[R]的已经出现过并且上次出现的下标值位于[L,R]区间,判断当前子序列[L,R-1]的长度是否更新,再更新L为a[R]上次出现过的下标值+1,这时子序列的区间为[L,R]。如果a[R]并没有出现过,将a[R]放入map中,并更新[L,R]这一段为新的子序列。

 1 /**2      * 输入一个长度为n的序列,寻找尽量长的子序列,使得该子序列中没有相同的元素3      */4     public static void getMin(int[] a) {5         int L=0,maxL=0,maxR=0;6         HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();7         for(int R=0;R<a.length;R++) {8             if(map.get(a[R])==null||map.get(a[R])<L) {9                 map.put(a[R], R);
10                 if(R-L>maxR-maxL) {//[L,R]
11                     maxR=R;maxL=L;
12                 }
13             }else {//碰到相同的了[L,R-1]->[上次出现的位置+1,R]
14                 if(R-L-1>maxR-maxL) {
15                     maxR=R-1;maxL=L;
16                 }
17                 L=map.get(a[R])+1;
18             }
19         }
20         System.out.println("L:"+maxL+" R:"+maxR+" length:"+(maxR-maxL+1));
21     }
22     public static void main(String[] args) {
23         int[]a= {3,4,5,1,2,4,5,3,6};
24         getMin(a);
25     }

滑动窗口+数据结构

滑动窗口的最小值问题:输入正整数k和一个长度为n的整数序列,f(i)表示从元素i开始连续k个元素的最小值,计算出0-(n-k)的最小值

思路:数据结构+滑动窗口,每一个新的元素进来如果他比之前的某些元素小,那么这些元素就不可能再成为最小值。如果他是最大的那么也要插入,因为随着区间的缩短,最小的被输出了那么很有可能会成为最小的。单调队列的话,最小值永远是队头,关键问题是如何知道这个最小值是在这个区间的那个位置,即什么时候更新队头,试想一下,这个最小值如果已经达到区间的边缘那么他们两个应该相等,这个时候应该移动队头,因为如果一个区间内的最小值重复出现,那么在插入的时候就要注意插入多次即可。

 1 /**2      * 滑动窗口的最小值问题:输入正整数k和一个长度为n的整数序列3      * f(i)表示从元素i开始连续k个元素的最小值,计算出0-(n-k)4      * 单调队列来实现5      */6     public static void getMin(int[] a,int k) {7         int[]s=new int[10];8         int rear=0;9         for(int i=0;i<k;i++) {
10             while(rear>0&&a[i]<s[rear-1]) {
11                 rear--;
12             }
13             s[rear++]=a[i];
14         }
15         int front=0;
16         for(int i=0;i<a.length-k;i++) {
17             System.out.println("f("+i+")="+s[front]);
18             if(s[front]==a[i]) {
19                 front++;
20             }
21             while(rear>front&&a[k+i]<s[rear-1]) {
22                 rear--;
23             }
24             s[rear++]=a[k+i];
25         }
26         System.out.println("f("+(a.length-k)+")="+s[front++]);
27     }
28     public static void main(String[] args) {
29         int[]a= {6,7,8,9,1,2,3};
30         getMin(a,3);
31     }

第八章(三)滑动窗口相关推荐

  1. WireShark 探索网络请求过程(五层网络模型、三次握手、滑动窗口协议)

    ​当我们在浏览器输入URL点击确认后,浏览器展示出网页信息.可你曾想过这其中的过程是怎样的?理论性较强的朋友可能知道后续DNS会解析地址,然后TCP/IP三次握手建立起连接,紧接着客户端与服务器开始传 ...

  2. TCP端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口

    参考文章:端口状态 LISTENING.ESTABLISHED.TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口

  3. UDP(首部)和TCP(首部、三次握手、四次挥手、可靠传输、滑动窗口、流量控制、拥塞控制(慢开始、拥塞避免、快重传、快恢复))

    1.UDP 用户数据报协议 UDP(User Datagram Protocol): 是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部 ...

  4. TCP/IP学习笔记(三)TCP流量控制以及滑动窗口

    众所周知,TCP是有缓冲区的,比如接收缓冲区用于存放已经到达但是还没有被应用程序及时处理的数据.但是任何缓冲区都是有一定大小的,如果发送方发送数据过快,而接收方处理数据过慢,就会导致接收方的接收缓冲区 ...

  5. 三句话介绍清楚滑动窗口协议/GBN/SR

    滑动窗口协议.GBN.SR之间不得不说的故事 首先我们来介绍什么是滑动窗口协议 滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制, ...

  6. leetcode 滑动窗口小结 (三)

    目录 978. 最长湍流子数组 题目 思路分析以及代码 1052. 爱生气的书店老板 题目 思考分析与初步代码 优化思路以及优化代码 1208. 尽可能使字符串相等 题目 思考分析以及代码 978. ...

  7. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  8. 计算机网络 HTTP工作机制 TCP三次握手四次挥手 TCP滑动窗口

    1.HTTP定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器.从层次的角度看,HTTP是面向事务的应用层协议.它规定了在浏览器之间的请求和响应的格式与规 ...

  9. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口

    1004 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口 题目描述 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 . 返回仅包含 1 的 ...

  10. 网络 传输层 | UDP协议与TCP协议详解(三次握手及四次挥手、滑动窗口、拥塞控制)

    概念 传输层:是负责应用程序之间的数据传输(通过端口的描述,描述了哪两个进程间的通信):传输层的两个主要协议:UDP 和 TCP UDP协议 UDP协议全称:用户数据报协议(User Dategram ...

最新文章

  1. App.config的典型应用
  2. IIS托管管道模式的集成和经典
  3. nodejs - 创建服务器(1)
  4. python详细安装教程3.8-手把手教你安装Python3.8环境
  5. c语言-指针的本质和使用
  6. javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第3部分
  7. 改2003远程端口3389的方法!
  8. 自定义DataAnnotations
  9. altium09怎么查元器件_长文图解:单张表数据量太大问题怎么解决?请记住这六个字...
  10. 关于团队项目的一些思考和理解
  11. 设计模式那点事读书笔记(2)----抽象工厂模式
  12. 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
  13. 初学者的SDN学习之路
  14. 网上购物系统设计类图
  15. 管家婆婆分销ERP V3 打印报错
  16. AS+图灵机器人官网+HTTP POST(json)+JsonReader实现安卓课设《智能聊天机器人》填坑记录
  17. 关于两种运行sh的方式: ./myscript.ksh and . ./myscript.ksh
  18. 省市县三级联动封装邮编数据列表
  19. NDP1415 40V输入20A外置MOS大电流同步降压控制器IC
  20. QT入门学习之软件程序开发初体验

热门文章

  1. 接口测试基础——第6篇unittest模块(三)
  2. Spring Boot和Dubbo整合
  3. opencv 基本绘图函数
  4. 静态成员变量.xml
  5. 【WCF--初入江湖】12 WCF与Ajax编程
  6. [ios] 申请账号,发布应用
  7. 对于长时间装载的ASP.NET页面如何在客户端浏览器中显示进度?
  8. 两个栈实现队列,两个队列实现栈
  9. python 拍照搜题_大学慕课2020用Python玩转数据答案搜题公众号
  10. 拓端tecdat|R语言代写岭回归ridge regression分析租房价格报告