【算法&数据结构体系篇class24】:滑动窗口技巧

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

一、滑动窗口是什么

滑动窗口是一种想象出来的数据结构:

滑动窗口有左边界L和有边界R

在数组或者字符串或者一个序列上,记为S,窗口就是S[L..R]这一部分

L往右滑意味着一个样本出了窗口,R往右滑意味着一个样本进了窗口

L和R都只能往右滑

二、滑动内最大值和最小值的更新结构

窗口不管L还是R滑动之后,都会让窗口呈现新状况,

如何能够更快的得到窗口当前状况下的最大值和最小值?

最好平均下来复杂度能做到O(1)

利用单调双端队列!

三、题目一

假设一个固定大小为W的窗口,依次划过arr

返回每一次滑出状况的最大值

例如,arr = [4,3,5,4,3,3,6,7], W = 3

返回:[5,5,5,4,6,7]文章来源地址https://www.toymoban.com/news/detail-408984.html

package class24;

import java.util.LinkedList;

/**
 * 假设一个固定大小为W的窗口,依次划过arr,
 * 返回每一次滑出状况的最大值
 * 例如,arr = [4,3,5,4,3,3,6,7], W = 3
 * 返回:[5,5,5,4,6,7]
 */
public class SlidingWindowMaxArray {

    //滑动窗口技巧   定义一个双端队列linkedlist辅助滑动弹出元素加入元素 保存数组元素的下标
    public static int[] getMaxWindow(int[] arr, int w){
        //边界判断 如果数组空 窗口大小0  窗口大小大于数组 都是无效的 返回空
        if(arr == null || w < 1 || arr.length < w) return null;

        //定义一个双端队列 qmax  从大到小排序 头部大 尾部小 保存的是数组的元素索引 不是元素数值 因为根据滑动要把溢出的元素弹出 需要获取到索引
        LinkedList<Integer> qmax = new LinkedList<>();

        //定义一个数组 保存结果 每个窗口 3个元素中的最大值。 这里数组的长度是固定的
        //数组长度8  窗口w=3 那么第一个窗口就是来到 4,3,5 返回5,第二个窗口时3,5,4 返回5,
        // 第三个窗口 5,4,3 返回5...依次类推最后结果是[5,5,5,4,6,7] 长度6 即arr长度8 - w3 +1 =6
        int[] res = new int[arr.length - w + 1];

        int index =0;  //定义结果集的下标从左到右
        //从左到右开始遍历 直到遍历完整个数组
        for(int r = 0; r < arr.length; r++){
            //题意要求每个窗口返回其最大值 所以我们元素进队列,需要把前面小于等于的值都弹出来
            //元素索引入队列前  需要判断 qmax非空时,如果当前数组arr[r]值大于等于队列尾部,
            //就将尾部索引值弹出,直到队列前面的元素值大于当前arr[r]值即可
            while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[r]){
                qmax.pollLast();
            }
            //队列中弹出后,就可以将当前r索引入队列
            qmax.addLast(r);

            //判断当前队列头部是否需要弹出 一个窗口3长度 当r来到3时,窗口值就 1,2,3 就需要将r-w=0位置弹出
            //如果r=5 那么窗口就是 3,4,5 队列中就需要将小于3的索引都去掉 因为要确保队列是保持着当前窗口最大值索引在队列头部的 超过了窗口的就要弹出
            if(qmax.peekFirst() == r - w){
                qmax.pollFirst();   //队列头部最大值的索引值如果不在当前窗口内 就需要弹出 避免影响当前窗口实际的最大值索引
            }

            //判断什么时候开始填入结果集,当我们r位置到达w窗口3个值长度时 就是第一个窗口的值需要填入了 0,1,2 也就是r=2时
            if (r  >= w - 1 ){
                //也就是r>=2 后面开始每个值对应一个窗口 窗口最大值就是当前队列的头部 头部保持最大值的索引
                res[index++] = arr[qmax.peekFirst()];
            }
        }
        return res;
    }

    // 暴力的对数器方法
    public static int[] right(int[] arr, int w) {
        if (arr == null || w < 1 || arr.length < w) {
            return null;
        }
        int N = arr.length;
        int[] res = new int[N - w + 1];
        int index = 0;
        int L = 0;
        int R = w - 1;
        while (R < N) {
            int max = arr[L];
            for (int i = L + 1; i <= R; i++) {
                max = Math.max(max, arr[i]);

            }
            res[index++] = max;
            L++;
            R++;
        }
        return res;
    }


    // for test
    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1));
        }
        return arr;
    }

    // for test
    public static boolean isEqual(int[] arr1, int[] arr2) {
        if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i+

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

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

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

相关文章

  • 数据结构习题24/12/24

    这道题目可以考虑,如果前缀是一样的长度,那么只需要两个链表同时向后检索,直到找到一样的元素为止。所以应该先找到两个链表的长度,然后将较长的一个链表的多出来的前缀部分删掉,也就不去看这一部分。因为后缀都是一样的,所以长度的差异只可能来自前缀。

    2024年02月04日
    浏览(42)
  • 24考研数据结构-图的存储结构邻接矩阵

    【1】顶点的结点结构 ——————— | data | firstarc | ——————— data数据域:储存顶点vi firstarc链域:指向链表中第一个结点 【2】弧的结点结构 —————————— | adjvex | info | nextarc | —————————— adjvex邻接点域:与顶点vi邻接的点在图中的位置 info数据域

    2024年02月14日
    浏览(57)
  • 24考研数据结构-——绪论2

    1.4.1 渐近时间复杂度 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(n),它表示随问题规模n的增大而增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的 渐近时间复杂度 ,简称时间复杂度。 大O表示“同阶”,

    2024年02月16日
    浏览(42)
  • 24考研数据结构-线性表4

    2.4.4单链表的查找操作(默认带头节点,不带头节点后续更新) 2.4.4.1 按位查找操作 GetElem(L, i): 按位查找操作,获取表L中第i个位置的元素的值; 注意: 1.边界情况 i=0,返回头节点;iL.length,返回null; 2.ji即查找到j = i 的节点,就是第i个节点。 3.平均复杂度O(n) 2.4.4.2 按值

    2024年02月16日
    浏览(40)
  • 【数据结构】24王道考研笔记——图

    图的定义 有向图以及无向图 简单图以及多重图 度 顶点-顶点间关系 连通图、强连通图 子图 (有向图也一样) 连通分量 强连通分量 生成树 生成森林 边的权、带权网/图 特殊形态的图 总结: 邻接矩阵 存储带权图(网): 对角线处可以填0或∞ 空间复杂度为O(|V| 2 )只和顶

    2024年02月17日
    浏览(50)
  • 【数据结构】24王道考研笔记——串

    串(字符串)是由零个或多个字符组成的有限序列。 子串:串中任意个连续的字符组成的子序列 主串:包含子串的串 字符在主串中的位置:字符在串中的序号 子串在主串中的位置:子串的第一个字符在主串中的位置 串的基本操作: 其中串执行比较操作时,从第一个字符开

    2024年02月15日
    浏览(72)
  • 24考研数据结构-数组和特殊矩阵

    数据结构是计算机科学中的基础概念,它涉及组织和存储数据的方式以及对数据的操作。在数据结构中,数组和特殊矩阵是两种常见的数据组织形式。本文将对数组和特殊矩阵进行介绍,并讨论它们在实际应用中的特点和用途。 数组是一种线性数据结构,它由相同类型的元素

    2024年02月14日
    浏览(37)
  • 企业级大数据体系结构

    作者:禅与计算机程序设计艺术 企业级大数据是指超大规模数据的集合,是管理者、分析师、决策者所需要分析和处理的一种信息资源。基于海量数据的复杂性及其多样性,实现数据可视化、数据挖掘、机器学习等数据处理功能的大数据平台也逐渐成为行业关注热点。因此,

    2024年02月06日
    浏览(46)
  • 【3.1数据库系统】数据库体系结构

    ①.外模式: 外模式面向具体的应用程序,定义在逻辑模式之上,但独立于存储模式和存储设备。 ②.概念模式(模式): 用于描述数据库的逻辑结构。 ③.内模式: 也称为存储模式或物理模式,是数据库内部的一种表示方式,用于描述数据物理结构和存储结构。 ①. 基本关

    2024年01月23日
    浏览(55)
  • 【数据结构】24王道考研笔记——树与二叉树

    树是n个结点的有限集合,n=0时,称为空树。非空树满足: 除了根节点外,任何一个结点都有且仅有一个前驱 结点的层次(深度):从上往下数 结点的高度:从下往上数 树的高度(深度):总共有多少层 结点的度:有几个孩子(分支) 树的度:各节点的度的最大值 森林:

    2024年02月13日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包