返回顶部
首页 > 资讯 > 后端开发 > JAVA >滑动窗口算法
  • 845
分享到

滑动窗口算法

数据结构算法java 2023-09-06 08:09:03 845人浏览 薄情痞子
摘要

目录 滑动窗口算法 基本思想  可解决问题 应用 题目一:最小覆盖子串 题目解读:  代码 题目二:长度最小的子数组 题目解读 代码 滑动算法窗口的优缺点 优点: 缺点: 滑动窗口算法 首先介绍一下什么是滑动窗口:滑动窗口算法是一种在

目录

滑动窗口算法

基本思想

 可解决问题

应用

题目一:最小覆盖子串

题目解读:

 代码

题目二:长度最小的子数组

题目解读

代码

滑动算法窗口的优缺点

优点:

缺点:


滑动窗口算法

首先介绍一下什么是滑动窗口:滑动窗口算法是一种在数组字符串中寻找特定模式的算法,它可以在 O(n) 的时间复杂度内解决一些字符串或数组相关的问题。

基本思想

滑动窗口算法的基本思想是维护一个窗口,窗口内是需要处理的数据,每次移动窗口时,我们只需要计算新窗口与旧窗口的区别即可,这样可以大大减少计算量。

具体地说,滑动窗口算法通常包括以下几个步骤:

  1. 初始化左右指针,表示窗口的左右边界。

  2. 移动右指针,扩大窗口,直到找到符合条件的窗口。

  3. 移动左指针,缩小窗口大小,直到不能再缩小为止。

  4. 在窗口移动的过程中,记录窗口的状态,例如最大值、最小值、子串长度等等。

  5. 返回窗口记录的结果。

 可解决问题

滑动窗口算法可以用于解决一些数组和字符串相关的问题,例如:

找到最长的连续子数组或子字符串:可以使用滑动窗口算法来寻找最长的连续子数组或子字符串。在遍历数组或字符串时,我们可以维护一个窗口,通过移动窗口来寻找最长的连续子数组或子字符串。

找到满足某些条件的子数组或子字符串:可以使用滑动窗口算法来寻找满足某些条件的子数组或子字符串。在遍历数组或字符串时,我们可以维护一个窗口,通过移动窗口来寻找满足某些条件的子数组或子字符串。

找到最小的覆盖子串:可以使用滑动窗口算法来寻找最小的覆盖子串。在遍历字符串时,我们可以维护一个窗口,通过移动窗口来寻找最小的覆盖子串。

找到无重复字符的最长子串:可以使用滑动窗口算法来寻找无重复字符的最长子串。在遍历字符串时,我们可以维护一个窗口,通过移动窗口来寻找无重复字符的最长子串。

滑动窗口算法通常适用于处理数组和字符串问题,而且要求问题可以通过窗口内的元素来计算得出。此外,滑动窗口算法通常可以将时间复杂度优化到线性,因此在处理大规模数据时具有很好的效率。

应用

下面,我将通过两道简单题目来演示滑动窗口算法的应用。

题目一:最小覆盖子串

给定两个字符串 S 和 T,求 S 中包含 T 所有字符的最短子串。

示例:

输入:S = "ADOBECODEBANC",   T = "ABC"

输出:"BANC"

题目解读:

我们可以维护两个指针 left 和 right,表示当前窗口的左右边界。初始时,左指针和右指针都指向字符串 S 的第一个字符。我们先移动右指针,直到找到包含字符串 T 的所有字符的子串。然后,我们移动左指针,缩小窗口大小,直到不能再缩小为止。在这个过程中,我们记录窗口的最小长度,并记录最小子串的起始位置。最后返回最小子串。

 代码

public String minWindow(String s, String t) {    int[] hash = new int[256];//ASCII 字符集共包含256个字符,因此使用长度为256的数组来记录窗口中每个字符出现的次数。    for (char c : t.toCharArray()) {        hash[c]++;    }    int left = 0, right = 0, count = t.length(), start = 0, len = Integer.MAX_VALUE;    while (right < s.length()) {        if (hash[s.charAt(right)] > 0) {            count--;        }        hash[s.charAt(right)]--;        right++;        while (count == 0) {            if (right - left < len) {                len = right - left;                start = left;            }            if (hash[s.charAt(left)] == 0) {                count++;            }            hash[s.charAt(left)]++;            left++;        }    }    return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);}

题目二:长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

输入:nums = [2,3,1,2,4,3], target = 7

输出:2

题目解读

我们可以维护两个指针 left 和 right,表示当前窗口的左右边界。初始时,左指针和右指针都指向数组的第一个元素。我们先移动右指针,直到窗口内的元素之和大于等于 target。然后,我们移动左指针,缩小窗口大小,直到不能再缩小为止。在这个过程中,我们记录窗口的最小长度,并更新最小长度的值。最后,返回最小长度。

代码

public int minSubArrayLen(int target, int[] nums) {    int left = 0, right = 0, sum = 0, len = Integer.MAX_VALUE;    while (right < nums.length) {        sum += nums[right];        while (sum >= target) {            len = Math.min(len, right - left + 1);            sum -= nums[left];            left++;        }        right++;    }    return len == Integer.MAX_VALUE ? 0 : len;}

滑动算法窗口的优缺点

优点:

  1. 时间复杂度较低:滑动窗口算法的时间复杂度通常是O(n),因为它只需要遍历一次原数组。
  2. 空间复杂度较低:滑动窗口算法通常只需要使用常数级别的额外空间。
  3. 简单易懂:滑动窗口算法的思路比较简单,容易理解和实现。

缺点:

  1. 无法解决所有子串问题:滑动窗口算法只适用于解决一些特定类型的子串问题,无法解决所有子串问题。
  2. 可能存在重复计算:在一些情况下,滑动窗口算法可能会对同一段区间进行重复计算,导致效率降低。
  3. 可能存在局限性:滑动窗口算法有些场景下可能无法得到最优解,需要结合其他算法进行优化。

来源地址:https://blog.csdn.net/m0_63951142/article/details/130671127

--结束END--

本文标题: 滑动窗口算法

本文链接: https://lsjlt.com/news/396768.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 滑动窗口算法
    目录 滑动窗口算法 基本思想  可解决问题 应用 题目一:最小覆盖子串 题目解读:  代码 题目二:长度最小的子数组 题目解读 代码 滑动算法窗口的优缺点 优点: 缺点: 滑动窗口算法 首先介绍一下什么是滑动窗口:滑动窗口算法是一种在...
    99+
    2023-09-06
    数据结构 算法 java
  • MYSQL窗口函数(Rows & Range)——滑动窗口函数用法
    语法介绍 窗口函数语法: over (partition by order by rows/range子句 ) 可以放以下两种函数: 1) 专用窗口函数,包括后面要讲到的rank, den...
    99+
    2023-09-03
    mysql 数据库
  • 滑动窗口算法高效率解决数组问题
    目录正文算法思路代码实现时间复杂度空间复杂度总结正文 滑动窗口算法是一种可以高效解决数组问题的算法。它通过维护一个固定大小的滑动窗口,来快速计算某些数组的相关指标或者求解一些特定的问...
    99+
    2023-05-20
    数组问题滑动窗口算法 滑动窗口算法
  • JavaScript日拱算法题解滑动窗口的最大值示例
    目录题目:题解:第一反应JavaScript 实现第二反应JS 实现小结:题目: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: num...
    99+
    2022-11-13
    JavaScript 滑动窗口最大值 JavaScript 题解 LeetCode
  • 【LeetCode算法成长之路】滑动窗口算法总结与经典题目分析
    前言 本文小新为大家带来 滑动窗口算法 相关知识,经过对滑动窗口算法类题目的总结,为大家分享滑动窗口算法概述(包括:滑动窗口算法思想,滑动窗口算法使用场景,滑动窗口算法使用思路),滑动窗口算法代码模...
    99+
    2023-09-08
    算法 leetcode java
  • pandas如何实现滑动窗口
    今天小编给大家分享一下pandas如何实现滑动窗口的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介绍窗口函数(Window ...
    99+
    2023-07-05
  • Python中TkinterScrollbar滚动条(窗口滑动条)
    目录简介语法参数简介 滚动条小部件用于向下滚顶其他小部件的内容,如列表框,文本和画布,但是,我们也可以为Entry小部件创建水平滚动条,常常被用于实现文本,画布和列表框的滚动 可以配...
    99+
    2023-03-03
    Python Tkinter Scrollbar滚动条 Python 滚动条
  • Java 滑动窗口最大值的实现
    一、题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口...
    99+
    2024-04-02
  • 数据链路层:滑动窗口协议
    滑动窗口协议基本概念 滑动窗口协议是流量控制协议;流量控制是通过限制发送方发出的数据流量,从而使发送速率不超过接收方接收速率的一种技术;主要由两种方式: ①停止-等待流量控制:其工作原理时发送方发出一...
    99+
    2023-10-05
    网络 服务器 网络协议
  • pandas库之DataFrame滑动窗口的实现
    目录(1)DataFrame的滑动窗口Example(2)pandas的窗口操作Rolling windowCentering windowsRolling applyWeighte...
    99+
    2023-05-13
    pandas DataFrame滑动窗口 pandas 滑动窗口
  • pandas实现滑动窗口的示例代码
    目录介绍示例数据移动平均值移动总和最大值和最小值结论介绍 窗口函数(Window Function)是一种在关系型数据库中使用的函数,通常用于计算某个范围内的数据。在数据分析中,窗口...
    99+
    2023-05-13
    pandas 滑动窗口
  • pandas库之DataFrame滑动窗口如何实现
    今天小编给大家分享一下pandas库之DataFrame滑动窗口如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。(1)...
    99+
    2023-07-05
  • redis zset实现滑动窗口限流的代码
    目录限流redis zset特性滑动窗口算法java代码实现补充:Redis zSet实现滑动窗口对短信进行防刷限流前言示例代码限流 需求背景:同一用户1分钟内登录失败次数超过3次,...
    99+
    2024-04-02
  • ASP.NET Core基于滑动窗口实现限流控制的方法
    今天小编给大家分享一下ASP.NET Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • ASP.NET Core基于滑动窗口实现限流控制
    目录前言:二、固定窗口算法三、滑动窗口算法四、实现六、使用结论:前言: 在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力...
    99+
    2024-04-02
  • golang实现时间滑动窗口的示例代码
    目录一 概念二 go-zero中的滑动窗口实现1.Bucket 样本窗口2. window 滑动窗口3. RollingWindow窗口三 使用一 概念 固定窗口...
    99+
    2024-04-02
  • Java C++分别实现滑动窗口的最大值
    目录1、题目2、思路3、c++代码4、java代码1、题目 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 提示: 你可以假设 k 总是有效的...
    99+
    2024-04-02
  • Android实现左滑关闭窗口
    前言 目前市场很多的APP都带有窗口滑动切换关闭,这种切换,使得用户操作比较爽,而且觉得功能点上也比较大气,在此就是自己总结了一个简易的方法,直接替换在基础窗口里面,使用安卓最基础的...
    99+
    2024-04-02
  • 移动窗口基线
        Oracle Database 会自动维护一个系统定义的移动窗口基线。系统定义的移动窗口基线的默认窗口大小为当前的AWR 保留期(默认为八天)。如果计划使用自适应阈,则可考虑使用...
    99+
    2024-04-02
  • ASP.NET Core中使用滑动窗口限流的问题举例分析
    本篇内容主要讲解“ASP.NET Core中使用滑动窗口限流的问题举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET Core中使用滑动窗口限流的问题举例分...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作