首页 > 其他分享 >【滑动窗口最值】滑动窗口的最值的一种方案

【滑动窗口最值】滑动窗口的最值的一种方案

时间:2023-12-15 16:45:38浏览次数:28  
标签:q1 p1 窗口 int top push 滑动 最值

  假设现在有数组a[n],和滑动的窗口长度为k <= n,要求长度为k的滑动窗口的最值,一般来说,我们会遇到以下问题:

 

  在窗口向右滑动时,由于不知道将要删除的元素在窗口中的位置,于是只能暴力遍历窗口来删除旧元素。增加了时间复杂度到O(n^2logn)

  以下是解决该问题的一种方案:

  使用一个额外的优先队列来储存待删除的元素,等到储存窗口的优先队列的队首元素和待删除元素所在元素相同时就一直删除俩队首,直到一方为空或者队首不再相等,时间复杂度为O(n*logn)

  相同代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,k;
signed main ()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>k;
    vector<int> mn;
    vector<int> mx,a(n);
    priority_queue<int> p,q;
    priority_queue<int,vector<int>,greater<int>> p1,q1;
    for(int i = 0; i < n; i++){
        cin>>a[i];
    }
    
    for(int i = 0; i < k; i++){
        p.push(a[i]);
        p1.push(a[i]);
    }
    mx.push_back(p.top());
    mn.push_back(p1.top());
    for(int i = k; i < n; i++){
        q.push(a[i - k]);
        q1.push(a[i - k]);
        if(p.size() && q.size()){
            while(p.top() == q.top()){
                p.pop();
                q.pop();
                if(p.empty() || q.empty()) break;
            }
        }
        if(p1.size() && q1.size()){
            while(p1.top() == q1.top()){
                p1.pop();
                q1.pop();
                if(p1.empty() || q1.empty()) break;
            }
        }
        p.push(a[i]);
        p1.push(a[i]);
        mx.push_back(p.top());
        mn.push_back(p1.top());
        
    }
    int len = mx.size();
    for(int i = 0; i < len; i++){
        cout<<mn[i]<<" ";
    }
    cout<<'\n';
    for(int j = 0; j < len; j++){
        cout<<mx[j]<<" ";
    }
    return 0;
}

  那么久只剩一个问题了,为什么时间复杂度减少到了O(n*logn) 看起来while循环很多对吧,其实我们换个角度考虑问题,每个元素最多入队4次,出队4次,

  我们一共有n个元素消耗时间T(4*n) 插入的时间复杂度时O(logn) 那么时间复杂度为O(nlogn) 成功减少了时间复杂度。

 

另:有储存下标来删除滑动窗口的做法。

标签:q1,p1,窗口,int,top,push,滑动,最值
From: https://www.cnblogs.com/jiangjlon/p/17903653.html

相关文章

  • 算法Day2双指针法排序,滑动窗口,螺旋矩阵
    Day2双指针法排序,滑动窗口,螺旋矩阵ByHQWQF2023/12/14笔记977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/返回一个非递减顺序排序的整数数组每个元素的平方后组成的新数组,新数组也按非递减顺序排序。解法:双指针法由于给定数组本身是有序的,......
  • RecyclerView组件强化——设置rv最大高度,显示滑动条,跳到最后子view
     意义:RecyclerView基础就LinearLayout排列子view。需要扩展它的最大高度,滑动条,跳到最后子view等1.设置最大高度:recycvlerView设置最大高度需求在:选取不同数据后需要一个Rv来展示所选数据。但布局的高度是有限的,导致rv不能设置自适应来无限增高intmaxH......
  • 刷题 ST表、单调栈、线段树->区间最值
    2023.12.13cf1904D2解题思路首先,a[i]大于b[i]时肯定不行,等于就满足了,直接过掉其次,要想使得a[i]等于b[i],就要在a[i]左右找最近的j使得a[j]=b[i](最近的最优,可证)k是i和j中间的一个数,想要满足题意,要满足以下两个条件(a[j]=b[i])1.ak<aj,即max(区间[i,j]中的ak)2.bk>bi,即min(区间......
  • 【leetcode 239. 滑动窗口最大值】Java优先队列——PriorityQueue类
    leetcode239.滑动窗口最大值题目描述:1e5大小的nums[]数组中长度为k(1<=k<=1e5)的窗口的最大值题解:暴力求解O(n^2)会超时,需要O(nlogn)的解法使用大根堆优先队列维护窗口元素,每次取最大值复杂度降为O(1),堆结构维护复杂度O(logn)问:如果维护窗口[l,r]前[0,l-1]的元素不影......
  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • 【uiautomator2 】app最重要的操作:点击、滑动、输入、按键、截屏操作
    app的操作:点击、滑动、输入、按键操作https://blog.csdn.net/Moonlight_16/article/details/125258638app主要包括4大操作:点击click滑动swipe输入按键一、app点击操作click先进行元素定位,找到元素后再去执行click操作;d(text='').click()1通过全局坐标点击,元素不......
  • 第 375 场周赛(滑动窗口,区间合并)
     使用差分的思想进行解决classSolution:defcountTestedDevices(self,batteryPercentages:List[int])->int:diff=0forxinbatteryPercentages:ifx>diff:diff+=1returndiff    clas......
  • 无涯教程-MFC - 窗口控件
    Windows控件是用户可以与之交互以输入或操作数据的对象,它们通常出现在对话框或工具栏上。Sr.No.Controls&描述1StaticControl静态Static控件向用户显示信息,它可以用于显示颜色,几何形状或图片,如图标,位图或动画。2AnimationControl动画控件是一个以AVI格式显示音频剪......
  • flink事件时间的水印延迟不会导致延迟数据在上一个窗口内
    设窗口为5,延迟为3。假如数据为:012567348则两个窗口为:window=TimeWindow{start=0,end=5}01234window=TimeWindow{start=5,end=10}5678即:567的数据不会包含在TimeWindow{start=0,end=5}里。验证程序:publicclassFlinkWindowExample{pu......
  • MFC窗口闪烁问题
    本文引自:《VC窗口闪烁问题的解决》概述一般的windows复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小时候出现闪烁。闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上,而是写到了显存里,显卡......