滑动窗口算法

简介: 滑动窗口算法

🍐滑动窗口的概念

🍐滑动窗口算法也是一种思想,是双指针的拓展和延伸  🍊 滑动:说明这个窗口是移动的,也就是移动是按照一定方向来的。

   🍊 窗口:窗口大小并不是固定的,可以不断扩容直到满足一定的条件;也可以不断缩小,直到找到一个满足条件的最小窗口;当然也可以是固定大小。

🍏适用场景

🍏 滑动窗口主要应用在数组和字符串上 ,在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。


🍋 什么情况适合用滑动窗口来解决实际问题呢?


   🍒 一般给出的数据结构是数组或者字符串。

   🍒 求取某个子串或者子序列最长最短等最值问题或者求某个目标值时。

🥑题目示例

题目:长度最小的子数组


题目描述:


给定一个含有n个正整数的数组和一个正整数target 。

找出该数组中满足其和≥target的长度最小的连续子数组[nums l,nums l+1,…, nums r-1, nums r],并返>回其长度。如果不存在符合条件的子数组,返回0。

=======================================

示例 1:

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

输出:2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

=======================================

示例 2:

输入:target = 4, nums = [1,4,4]

输出:1

=======================================

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]

输出:0


🥑上文提到:“滑动窗口算法也是一种思想,是双指针的拓展和延伸”。为了更加直观的体现这种思想,我决定用队列来模拟滑动窗口,以队头和队尾作为双指针来进行演示整个题解过程。


🍑我们把数组中的元素不停的入队,直到总和大于等于target为止,接着记录下队列中元素的个数,然后再不停的出队,直到队列中元素的和小于target为止(如果不小于target,也要记录下队列中元素的个数,这个个数其实就是不小于target 的连续子数组长度,我们要记录最小的即可)。接着再把数组中的元素添加到队列中......重复上面的操作,直到数组中的元素全部使用完为止。

这里以[2,3,1,2,4,3]举例画个图来看下:

🥕解题代码

   🍏双指针:

public class Main {
    public static int minSubArrayLen(int target, int[] nums) {
        int low = 0, high = 0;//low:队头 , high:队尾
        int sum = 0, min = Integer.MAX_VALUE;
        while (high < nums.length) {
            sum += nums[high++];
            while (sum >= target) {
                min = Math.min(min, high - low);
                sum -= nums[low++];
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }
    public static void main(String[] args) {
        System.out.println(minSubArrayLen(7, new int[]{2, 3, 1, 2, 4, 3}));
    }
}

  🍏队列:

public class Main {
    public static int minSubArrayLen(int target, int[] nums) {
        int num = 0;//计算子数组的累计和
        int min = nums.length;//长度赋初值
        boolean flag = false;//判断长度值是否改变过
        Deque<Integer> deque = new ArrayDeque<>();//定义出能体现滑动窗口数据结构的数据结构————队列,这样的双端队列更加高效。
        int index;//用于记录位置的指针
        for (index = 0; index < nums.length; index++) {//设置滑动窗口的初始长度
            if (num >= target) {
                min = Math.min(min, deque.size());//保留之前值与当前值中的较小值
                flag = true;
                break;
            }
            deque.addLast(nums[index]);//向队列中添加数据nums[index]
            num += nums[index];
        }
        //上面的循环用于初始化滑动窗口的长度,此时我们就已经有了一个长度为deque.size()的窗口了
        while (num >= target || index < nums.length) {
/*此时deque中存放值的总和已经超过了目标值target,此时我们的窗口已经满足的滑动的条件,
如果现在num的值超过目标值就将前面先进入队列deque的值踢出,就相当于窗口就向后移动了一步  */
            if (num >= target) {
                min = Math.min(min, deque.size());
                flag = true;
                num -= deque.poll();
            } else {//如果此时不满足num>=target条件就继续向后延伸,向队列deque中推入之后的值加到num中。
                num += nums[index];
                deque.addLast(nums[index++]);
            }
        }
        if (!flag) return 0;
        return min;
    }
    public static void main(String[] args) {
        System.out.println(minSubArrayLen(7, new int[]{2, 3, 1, 2, 4, 3}));
    }
}

🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟文章粗浅,希望对大家有帮助!

相关文章
|
12天前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
7月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
179 2
|
5月前
|
存储 机器学习/深度学习 监控
公司电脑上网监控中滑动窗口算法的理论构建与工程实现
本文提出一种基于滑动窗口算法的实时网络流量监控框架,旨在强化企业信息安全防护体系。系统采用分层架构设计,包含数据采集、处理与分析决策三大模块,通过 Java 实现核心功能。利用滑动窗口技术动态分析流量模式,结合阈值检测与机器学习模型识别异常行为。实验表明,该方案在保证高检测准确率的同时支持大规模并发处理,为企业数字化转型提供可靠保障。
112 0
|
7月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
155 3
|
8月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
182 3
|
算法
【算法】滑动窗口——最小覆盖子串
【算法】滑动窗口——最小覆盖子串
126 0
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
184 0
|
11月前
|
算法
|
算法 容器
【算法】滑动窗口——串联所有单词的子串
【算法】滑动窗口——串联所有单词的子串
117 0
|
算法
【算法】滑动窗口——水果成篮
【算法】滑动窗口——水果成篮
110 0

热门文章

最新文章

下一篇
开通oss服务