首页 > 其他分享 >滑动窗口

滑动窗口

时间:2023-04-13 22:55:19浏览次数:35  
标签:std 窗口 int tt hh 滑动

算法简介

长度为 k 的窗口,即为从原数组中连续 k 位的子数组。

滑动窗口即保持窗口的长度为 k ,且窗口从 1 ~ k 不断向后移动变为 2 ~ k+1 , 3 ~ k+2,直到 n - k + 1 ~ n。

其中窗口大小不变通过将最左侧数移出窗口,右侧数移入窗口实现

时间复杂度

\(O(n)\)

实现原理

假设求滑动窗口中的最小值(最大值同理)

首先对于如下长度为 3 的窗口:

假设看 -1 和 -3:

因为 -3 在 -1 的后面,且比 -1 晚移出窗口,由于 -3 比 -1 小,所以 -1 在之后的情况下永远不可能成为最小值,即在该情况下可以不考虑 -1 ,将它移出窗口。3 和 -3 同理。

算法实例

1. 题目描述

https://www.acwing.com/problem/content/description/156/

2. AC代码

#include <bits/stdc++.h>
const int N = 1000010;

int hh,tt;
int q[N],a[N]; // q存储的是下标

int main() {
    int n,k;
    std::cin >> n >> k;
    for (int i = 1; i <= n; i ++ ) std::cin >> a[i];
    
    // 最小值
    hh = 0,tt = -1;
    for (int i = 1; i <= n; i ++ ) {
        // 左侧数移出窗口
        if(hh <= tt && i - k + 1 > q[hh]) hh ++ ;
        
        while(hh <= tt && a[q[tt]] >= a[i]) tt -- ;
        q[++ tt] = i;
        
        if(i >= k) std::cout << a[q[hh]] << ' ';
    }
    
    std::cout << "\n";
    
    // 最大值
    hh = 0,tt = -1;
    for (int i = 1; i <= n; i ++ ) {
        // 左侧数移出窗口
        if(hh <= tt && i - k + 1 > q[hh]) hh ++ ;
        
        while(hh <= tt && a[q[tt]] <= a[i]) tt -- ;
        q[++ tt] = i;
        
        if(i >= k) std::cout << a[q[hh]] << ' ';
    }
    
    return 0;
}

参考

[1] https://www.acwing.com/solution/content/97229/

标签:std,窗口,int,tt,hh,滑动
From: https://www.cnblogs.com/NachoNeko/p/17316872.html

相关文章

  • 【LBLD】滑动窗口算法延伸:RABIN KARP 字符匹配算法
    滑动窗口算法延伸:RABINKARP字符匹配算法187.重复的DNA序列普通方法:classSolution{public:vector<string>findRepeatedDnaSequences(strings){intn=s.size();unordered_set<string>seen;unordered_set<string>res;......
  • MFC-IsWindow判断指定窗口句柄是否标识了现有窗口
     HWNDhWnd=GetSafeHwnd();BOOLbb=IsWindow(hWnd);//判断指定窗口句柄是否标识了现有窗口//返回值:如果窗口句柄标识现有窗口,则返回值为非零//如果窗口句柄未标识现有窗口,则返回值为零     ......
  • flomo 窗口置顶 - 通用方法 autohotkey
    需求开网页的时候需要记录一些东西想一直显示操作要安装https://www.autohotkey.com/创建个.ahk文件运行下快捷键是alt+小键盘8;置顶当前窗口!Numpad8::winset,AlwaysOnTop,,AReturn使用打开flomo为当前激活,然后按快捷键即可。......
  • js 判断是否为 IE 通过事件关闭新打开的浏览器窗口
    //必须通过target="_blank"打开新窗口才可关闭if(window.ActiveXObject||"ActiveXObject"inwindow){//iewindow.location.href="about:blank";//为兼容IE作此修改window.close();}else{wi......
  • 滑动窗口系列
    滑动窗口适合在题目要求连续的情况下使用相关题目模板:/*滑动窗口算法框架*/voidslidingWindow(strings){//用合适的数据结构记录窗口中的数据unordered_map<char,int>window;intleft=0,right=0;while(right<s.size()){//......
  • MFC-IsIconic判断窗口是否最小化
     HWNDhWnd=NULL;UINTfunc1(LPVOIDpParam)//线程函数{BOOLbb;for(inti=0;i<1000;i++){bb=IsIconic(hWnd);//判断窗口是否最小化/*参数1:HWNDhWnd窗口句柄返回值:已经最小化返回TRUE,......
  • 如何在Mac上的一个“预览”窗口中显示若干文件呢?
    如何在Mac上的一个“预览”窗口中显示若干文件呢?您可以设定多个图像文件在“预览”中是以单独的窗口打开,还是在同一个窗口打开。还可以将文件或页面添加到已打开的PDF中,快来跟小编看看吧!【注】若要在同一个窗口中打开多个PDF,您需要打开“系统偏好设置”,点按“程序坞”,然后从“打......
  • 直播平台软件开发,Android代码模拟触摸、点击及滑动等事件
    直播平台软件开发,Android代码模拟触摸、点击及滑动等事件一、应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 privatevoidsimulateClick(Viewview,floatx,floaty){  longdownTime=SystemClock.uptimeMillis();  finalMotionEventdownEve......
  • MFC-GetMainWnd获取主窗口指针
     CWinApp*pwin=AfxGetApp();//获取当前应用进程的指针CWnd*pWnd=pwin->GetMainWnd();//获取主窗口指针CGetMainWndDlg*pDlg=(CGetMainWndDlg*)pWnd;//主窗口指针转化成对话框类指针pDlg->SetWindowText(_T("练习"));CWnd*pWnd1=pWn......
  • MFC-RegisterWindowMessage给窗口增加一个消息
     UINTshowMyAppMsg=RegisterWindowMessage(_T("MYAPP_SHOW"));//给窗口增加一个消息/*定义一个新的窗口消息,保证该消息在系统范围内是唯一的。通常调用SendMessage或者PostMessage函数时,可以使用该函数返回的消息值参数:LPCTSTRlpString消息字符串......