滑动窗口算法

滑动窗口算法什么是滑动窗口算法我们学习过计算机网络都知道为了避免拥塞发生 在网络传输时有滑动窗口协议控制传输时流量 该协议允许发送方在停止并等待确认前发送多个数据分组 由于发送方不必每发一个分组就停下来等待确认 因此该协议可以加速数据的传输 提高网络吞吐量 这个跟我们今天说的滑动窗口算法是一个原理 滑动窗口算法的作用该算法的作用就是将我们多层嵌套的循环语句根据局部最优解来转换为单个的循环语句 从而减少时

什么是滑动窗口算法

我们学习过计算机网络都知道为了避免拥塞发生,在网络传输时有滑动窗口协议控制传输时流量。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。这个跟我们今天说的滑动窗口算法是一个原理。

滑动窗口算法的作用

该算法的作用就是将我们多层嵌套的循环语句根据局部最优解来转换为单个的循环语句,从而减少时间复杂性。

下面我们通过LeetCode 上的一道题来看看滑动窗口究竟该如何使用

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

示例 2:

示例 3:

分析

这道题目我们需要找到字符串中的最长的子串,普通的暴力解法是通过for循环遍历给定字符串的所有子串,判断子串中有没有重复的字符,如果没有则找出最长的。

但是上面的算法我们时间复杂度为O(n^3)。那么有没有更好的算法呢,当然是有的,那就是滑动窗口算法。通过使用HashSet作为滑动窗口,我们可以用O(1)的时间来完成对字符是否在当前的子字符串中的检查。

滑动窗口是数组/字符串问题中常用的抽象概念。窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即[left,right)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将[left,right)向右滑动1个元素,则它将变为[left+1,right+1)(左闭,右开)。我们使用HashSet将字符存储在当前窗口[left,right)(最初left=right)中。然后我们向右侧滑动索引right,如果它不在HashSet中,我们会继续滑动 right。直到s[right]已经存在于HashSet中。此时,我们找到的没有重复字符的最长子字符串将会以索引left开头。如果我们对所有的leift这样做,就可以得到答案。

 public int lengthOfLongestSubstring(String s) { int n = s.length(); Set 
  
    set = new HashSet<>(); int ans = 0, left = 0, right = 0; while (left < n && right < n) { if (!set.contains(s.charAt(right))){ set.add(s.charAt(right++)); ans = Math.max(ans, right - left); } else { set.remove(s.charAt(left++)); } } return ans; } 
  

算法分析

这里时间复杂度为 O(2n)=O(n),空间复杂度为O(min(m,n))。

优化

这里我们还可以将算法优化,将字符串中每个字符和索引形成映射关系。举个例子,给定字符串“abcabcbb”,这里我们依次按照上述算法执行,我们到第四个字符也就是right为3时,我们left可以跳过前面的0123,直接left和right为4,从4开始再继续找。

 public int lengthOfLongestSubstring(String s) { int length = s.length(); HashMap 
  
    map = new HashMap 
   
     (); int ans =0; for(int left = 0,right = 0; left < length && right < length;right++){ if (map.containsKey(s.charAt(right))){ left= Math.max(map.get(s.charAt(right)),left); } ans = Math.max(ans,right-left+1); map.put(s.charAt(right),right+1); } return ans; } 
    
  

总结

从上面的解题我们可以明显的发现,滑动窗口算法的的时间复杂度为线性的(O(n)),我们可以用此算法来查找最大/最小k-子序列,XOR,乘积,总和等一些列问题。

参考资料

无重复字符的最长子串

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199583.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:40
下一篇 2026年3月20日 下午12:41


相关推荐

  • 水仙花数的判断(JAVA)

    水仙花数的判断(JAVA)水仙花数 JAVA 水仙花数的判断 JAVA 水仙花数的判断 JAVA 用户输入一个数 判断是否是 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 题目分析水仙花数是一个三位数 将用户输入的三位数拆分成为单独的个位 十位 百位 对三个数字分别进行三次方运算 然后对运算后的三个数进行求和 如果运算得到的结果与用户输入的三位数相等 则说明该数为水仙花数 如果不等则说明不是 代码分析键盘输入需要用到 Scanner Scanner 是 JDK 中封装的一个类 该类的职责

    2026年3月19日
    2
  • 预测算法简介

    预测算法简介原文 0Afewmorecon 1 什么是 bagging 和 boosting linkbagging Bagging 是 BootstrapAgg 的英文缩写 是指一种有放回采样 boosting 提升方法 Boosting 是一种可以用来减小监督式学习中偏差的机器学习算法 面对的问题是迈可 肯斯 MichaelKearn 提出的 一组 弱学习者 的集合能否生成一个 强学习者 弱学习者一般是指一个分类器 它的结果只比随机分类好一点点

    2026年3月18日
    3
  • Eclipse导入Github上的Robotium源码进行代码分析的步骤

    Eclipse导入Github上的Robotium源码进行代码分析的步骤这篇文章应该只是针对像我这样的初级Maven用户的,因为自己花了不少时间来解决这个问题,而网上很多文章描述的也是语焉不详,所以记录下来以便后来如我者可以借鉴一二。文中有几点细节我觉得需要注意的我会高亮出来。1.问题描述今天打算查看一下Robotum(其项目本身基于maven,因为我发现项目中有pom.xml文件)框架的源代码去了解其具体实现以加深理解,但下载后按照认知的方法去Import

    2022年7月25日
    12
  • 纸的大小图解_常用纸张尺寸及示意图(A0,A1A3,A4,A5A8)数据源维基百科.PDF

    纸的大小图解_常用纸张尺寸及示意图(A0,A1A3,A4,A5A8)数据源维基百科.PDF常用纸张尺寸及示意图(A0,A1A3,A4,A5A8)数据源维基百科mFPCharging-常用纸张尺寸说明2011-12-09v2.0常用纸张尺寸及示意图(A0,A1…A3,A4,A5…A8)数据源:维基百科标准定义ISO216定义了A、B、C三个系列的纸张尺寸。C系列纸张尺寸主要使用于信封。ISO216的格式遵循着的比率;放在一起的两张纸有着…

    2022年6月20日
    68
  • Window下kafka 单机SASL_SCRAM加密及身份认证

    Window下kafka 单机SASL_SCRAM加密及身份认证nbsp nbsp nbsp KAFKA 加密认证机制中的 SASL 主要包括 SASL PLAINTEXTSAS GSSAPISASL SCRAM 这里主要记录一下 Windows 下搭建配置单机 sasl scram 环境 一 前情提要 nbsp nbsp SCRAM 是 kafka 安全机制 SASL 家族中的一个 通过执行用户名 密码认证 如 PLAIN 和 DIGEST MD5 的传统机制来解决安全问题 Kafka 中的默认 SCRAM 实现是

    2026年3月16日
    0
  • 人生就是一场康波「建议收藏」

    人生就是一场康波「建议收藏」理论创建人–周金涛2016年3月16日,中信建投首席经济学家周金涛先生参加由上海清算所等举办的第30期清算所沙龙——“2016年债务融资工具专题”活动。在沙龙活动中,周期天王周金涛先生阐述了康波经济周期理论对宏观经济走势的研判,以下是演讲实录。60年的经济周期:人生有三次财富机会重要经济周期理论开创者是两个,第一个康波周期,实际上它是全球经济运动的决定力量,也是在座各…

    2025年8月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号