滑动窗口算法

这篇具有很好参考价值的文章主要介绍了滑动窗口算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

滑动窗口算法

基本思想

 可解决问题

应用

题目一:最小覆盖子串

题目解读:

 代码

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

题目解读

代码

滑动算法窗口的优缺点

优点:

缺点:


滑动窗口算法

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

基本思想

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

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

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

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

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

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

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

 可解决问题

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

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

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

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

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

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

应用

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

题目一:最小覆盖子串

给定两个字符串 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。然后,我们移动左指针,缩小窗口大小,直到不能再缩小为止。在这个过程中,我们记录窗口的最小长度,并更新最小长度的值。最后,返回最小长度。文章来源地址https://www.toymoban.com/news/detail-779776.html

代码

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. 可能存在局限性:滑动窗口算法有些场景下可能无法得到最优解,需要结合其他算法进行优化。

到了这里,关于滑动窗口算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 数据结构与算法-树

    树的基础知识 树是算法面试经常遇到的数据结构之一,在实际工作中也有可能经常用到…… 应聘者在准备算法面试时最需要重视的是二叉树…… 二叉树是一种典型的具有递归性质的数据结构。二叉树的根节点可能有子节点,子节点又是对应子树的根节点,它可能也有自己的

    2024年02月08日
    浏览(54)
  • Java数据结构与算法:查找算法之二分查找

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎回到本专栏。在这个冰冷的季节里,我们将一同探讨Java中一种高效的查找算法——二分查找。让我们点燃知识的火花,一同解锁这个查找奇迹的秘密! 二分查找简介 二分查找,也称为折半查找,

    2024年01月21日
    浏览(47)
  • 【数据结构】用Java实现七大排序算法

    目录 🌷1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指标 1.2 十个排序算法  1.3 十个排序性能对比 🌷2. 冒泡排序 2.1 算法描述 2.2 动图 ⭐️代码优化 🌷3. 选择排序 3.1 算法描述 3.2 动图  3.3 代码 🌷4. 插入排序 4.1 算法描述 4.2 动图  4.3 代码 🌷5 希尔排序 5.1 描述 5.2 动图  

    2023年04月23日
    浏览(54)
  • 255.【华为OD机试】最小矩阵宽度(滑动窗口算法-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年03月13日
    浏览(64)
  • Java数据结构与算法:二叉搜索树

    Java数据结构与算法:二叉搜索树 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在计算机科学中,二叉搜索树(Binary Search Tree,简称BST)是一种常见的树形数据结构,它具有良好的查找和插入性能。每

    2024年01月24日
    浏览(45)
  • 【算法与数据结构】Java实现查找与排序

    也叫做折半查找,属于有序查找算法。 前提条件 :数组数据必须有序,从小到大,或者从大到小都是可以的。 如果是无序的,也可以先进行排序。 但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数

    2024年01月19日
    浏览(51)
  • Java数据结构与算法----动态规划(背包篇)

    1.1.算法思路 0/1背包是动态规划、背包问题中最经典的问题啦!它主要的问题是: 给定n种物品、这n种物品的重量分别是,价值分别是 ,而你有一个容量为C的背包,请问如何求出所能拿的最大价值呢? 对于动态规划,我们先需要找到一条推导公式,然后确定边界: 我们设

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包