码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构_队列和滑动窗口

时间:2020-06-25 16:04:50      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:队列   scan   滑动   push   can   数据   模拟   元素   const   

数组模拟队列

代码模板

const int N = 1e6 + 10;
int q[N], hh = 0, rr = -1;

void push(int x) {
    q[++rr] = x;
}

void pop() {
    ++hh;
}

void isempty() {
    return hh <= rr;
}

void query() {
    cout << q[hh] << endl;
}

滑动窗口:求滑动窗口里的最小值为例

思路分析:

  • 如果下标i、j都在滑动窗口内部, 而且i < j, 但是a[i] > a[j], 因此, a[i]永远不可能作为答案出现。
  • 因此,每次在队列里插入的数时应保证队尾元素比要插入的数小,因此构造出单调递增的队列。
const int N = 1e6 + 10;
int a[N],q[N];
int hh, tt;
void solve() {
    int n,k; scanf("%d%d",&n,&k);
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);
    hh = 0, tt = -1;
    for(int i = 0; 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 - 1) printf("%d ", a[q[hh]]);

    }
}

数据结构_队列和滑动窗口

标签:队列   scan   滑动   push   can   数据   模拟   元素   const   

原文地址:https://www.cnblogs.com/Hot-machine/p/13191769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!